alten Kram neu verstehen
-
Moin,
folgender Code:
#include <stdio.h> int main() { char* f = "bbcedfgh"; f[0] = 'a'; return 0; }
die Ausgabe (für mich unerwartet):
mogel@lucretia:~/temp/code$ gcc code.c mogel@lucretia:~/temp/code$ ./a.out Speicherzugriffsfehler (Speicherabzug geschrieben) mogel@lucretia:~/temp/code$
seit wann wurde das gestrichen bzw. wann wurde da ein "Schutz" eingebaut. Weil unter VisualDSP (AnalogDevices) funktioniert es.
hand, mogel
-
Schalt mal die Warnungen an -Wall.
char* f = "bbcedfgh";
Sollte eine Warnung generieren.
"bbcedfgh" ist ein string literal, welches nicht verändert werden kann und f sollte daher einconst char*
sein
-
@mogel sagte in alten Kram neu verstehen:
seit wann wurde das gestrichen
AFAIK ist das schon seit ANSI-C nicht erlaubt. Es kann natürlich immer sein, dass das Programm trotzdem macht, was man erwartet.
-
Es ist seit jeher undefiniertes Verhalten. Aber "undefiniert" bedeutet halt unter anderem auch, dass es funktionieren darf.
-
@firefly sagte in alten Kram neu verstehen:
Sollte eine Warnung generieren.
macht es nicht - erst wenn ich const davor schreibe (dann ist [mir] das aber klar)
ansonsten danke, mogel
-
@mogel sagte in alten Kram neu verstehen:
@firefly sagte in alten Kram neu verstehen:
Sollte eine Warnung generieren.
macht es nicht - erst wenn ich const davor schreibe (dann ist [mir] das aber klar)
Unmöglich. Mit einem korrekt gesetzten const darf das gar nicht compilieren. Vielleicht verwechselst du Warnungen und Fehler?
-
Siehe
https://stackoverflow.com/questions/2245664/what-is-the-type-of-string-literals-in-c-and-c
sowie
https://stackoverflow.com/questions/15970171/why-can-i-assign-a-string-literals-to-a-char-pointer