char *str1 = "Hello";
- diese Zeile, obwohl erlaubt (von vielen Compilern), ist eine schlechte Idee, tatsächlich zu tun. Es ist im Grunde nur für Rückwärtskompatibilität mit C erlaubt, und das Schreiben in * str1 führt zu undefiniertem Verhalten. Ich würde empfehlen, die Compiler-Einstellung zu finden, die Ihnen Warnungen gibt, wenn Sie dies tun, und wenn Ihr Compiler solche Warnungen nicht hat, einen neuen Compiler zu finden.
Der C++ Standard gibt Compilern und Ausführungsumgebungen lächerliche Freiheitsgrade, wo "String literals"
gespeichert sind. Sie könnten buchstäblich einen Zeiger auf den "literal"
-Teil von "String literals"
als den Zeigerwert für "literal"
verwenden, und das Speichern in Speicher, in dem Sie segfault, wenn Sie versuchen, sie zu bearbeiten, ist nicht unerwartet.
Beachten Sie, dass char buf1[] = "Hello";
tut etwas grundsätzlich anderes als char* str1 = "Hello";
: es initialisiert tatsächlich den Puffer buf1
mit den Zeichen {'H','e','l','l','o','\0'}
.
Haben Sie die Optimierungen deaktiviert? –
"und sie verweisen auf verschiedene Speicherorte" ... nun, es stellt sich heraus, dass sie tatsächlich auf den gleichen Ort zeigen. Dies ist erlaubt. –
Die zwei backquotes im Quellcode sollten verhindern, dass sie kompiliert werden (und bei einem konformen C++ 11-Compiler sollte das Fehlen von "const" die Kompilierung verhindern). –