Warum verursacht char * nicht definiertes Verhalten, während char [] dies nicht tut?

8

Der Versuch, ein Zeichenfolgenliteral zu ändern, führt zu undefiniertem Verhalten:

%Vor%

Eine Möglichkeit, dies zu verhindern, ist die Definition als Array anstelle eines Zeigers:

%Vor%

Warum verursacht char* undefiniertes Verhalten, während char[] nicht?

    
Terry Li 28.11.2011, 21:05
quelle

1 Antwort

14

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 char u[] = *p funktioniert nicht - Arrays können nur von einem geschweiften Initialisierer initialisiert werden und Arrays zusätzlich von einem String-Literal.

    
Kerrek SB 28.11.2011, 21:08
quelle

Tags und Links