Andreas Pflug: C , Zeigerzugriff

Beitrag lesen

Natürlich nicht. Denn mit der Deklaration char* wird nur ein Pointer auf ein char angelegt und kein Array wie mit

»»   char bla[100];

(wie Du ja schon selbst bemerkst). Die Zeichenkette oben ist nicht etwas "schreibgeschützt", sondern gar nicht existent, [...]

Nicht existent??? Wenn ich folgendes schreibe

char *bla = "Dies ist eine schreibgeschuetzte Zeichenkette.\n";
puts(bla);

wird die Zeichenkette ja immerhin ausgegeben ;-)

Schreibt man in C eine Zeichenkette in doppelten
Anführungszeichen, wird diese zunächst in der compilierten
Programmdatei irgendwohin hard-codiert, was man sich mit u. a. dem
Unix-Befehl 'strings program_file' ansehen kann.

Beim Ausführen des Programms gelangt dieser String
zusammen mit dem Maschinencode des Executables
in einen schreibgeschützten Bereich, von dem mir
gerade der Fachterminus entfallen ist. Die Variable 'bla'
im obigen Beispiel enthält dann die Anfangsadresse
dieses hardcodierten Strings, jedoch kann der String-Inhalt nicht
geändert werden, weil veränderliche Speicherbereiche
in C vorher entweder auf dem Stack (-> automatische Variablen)
oder auf dem Heap (--> malloc & Co.) reserviert werden müssen,
was für den hard-codierten String nicht zutrifft.

Mit

char bla[] = "Hallo\n";

wird dagegen auf dem Stack ein Array angelegt und anschließend
der hard-codierte String dort hinkopiert. Die Kopie kann
dann anschließend auch geändert werden.

MfG

Andreas