Warum funktioniert der folgende Code? Sollte das ein Übersetzungsfehler (oder zumindest ein Laufzeitfehler) sein?Warum kann ich einem Zeiger eine Zeichenfolge zuweisen?
#include <stdio.h>
int main(int argc, char** argv){
float *buf = "happy holiday"; // notice the float
printf("content of buf = %s\n",buf); //its working
return 0;
}
ich es kompiliert und bekam nur eine Warnung:
~/Desktop/cTest>gcc -o run run.c
run.c: In function `main':
run.c:4: warning: initialization from incompatible pointer type
Ich stimme Ihrer Behauptung nicht, dass mindestens diese Warnoptionen verwendet werden sollten. Selbst in diesem winzigen Beispiel haben Sie falsche Positive (die nicht verwendeten Parameterwarnungen) erzeugt, die * normalerweise * nicht unterdrückt werden können, ohne unnötigen Code hinzuzufügen. Hier könnte die andere Form von 'main' verwendet werden, aber was wäre, wenn Sie nur' argv' brauchen, aber nicht 'argc'? Ich bin ein großer Befürworter des Compilers warnen (und Fehler) auf ungültigen oder definitiv schlechten Code, aber die Reihe von Optionen, die Sie vorgeschlagen, wird notwendigerweise tadellos guten Code zurückweisen, es sei denn, Sie bemühen sich, es gcc's Willen zu verkomplizieren ... –
@R .. Ich kann mit den trivialen Fixes leben, um mit den "falschen" positiven Ergebnissen im Austausch für den Schutz, den es bietet, umzugehen. Was befürworten Sie stattdessen? –
Normalerweise verwende ich '-Wall' (aber nicht' -Wextra') und schalte dann einige Optionen mit '-Wno- *' aus (z. B. nicht verwendete Funktionsparameter). –