Jeder Versuch, ein C-String-Literal zu ändern, hat ein undefiniertes Verhalten . Ein Compiler kann dafür sorgen, dass String-Literale in einem Nur-Lese-Speicher gespeichert werden (geschützt durch das Betriebssystem, nicht buchstäblich ROM, es sei denn, Sie befinden sich in einem eingebetteten System). Aber die Sprache erfordert das nicht; es liegt an dir als Programmierer, es richtig zu machen.
Ein hinreichend schlauer Compiler hätte Sie warnen können, dass Sie den Zeiger als:
deklariert haben sollten %Vor% obwohl die Deklaration ohne const
in C legal ist (um alten Code nicht zu brechen). Aber mit oder ohne Compiler-Warnung ist const
eine sehr gute Idee.
(In C ++ sind die Regeln anders; C ++ - String-Literale sind im Gegensatz zu C-String-Literalen wirklich const
.)
Wenn Sie ein Array mit einem Literal initialisieren, ist das Literal selbst noch in einer potenziell schreibgeschützten Region Ihres Programmabbilds vorhanden, wird jedoch in das lokale Array kopiert:
%Vor% Beachten Sie, dass funktioniert nicht - Arrays können nur von einem geschweiften Initialisierer initialisiert werden und Arrays zusätzlich von einem String-Literal. char u[] = *p
Tags und Links string c undefined-behavior char