005
08.08.2009, 13:30 Uhr
0xdeadbeef
Gott (Operator)
|
Zitat von Lensflare: |
C++: |
char *s = "test"; s = "hallo"; s[1] = 'e';
std::cout << s;
|
|
Dass der Code funktioniert und was er macht ist rein zufällig - undefiniertes Verhalten halt. Rechne mit Segfaults. Warum der bei dir macht, was er macht, anstatt einfach abzustürzen, kann ich mit Sicherheit auch nicht sagen. Meine Vermutung ist, dass das Literal in einem nicht schreibbaren Speicherbereich liegt, das Betriebssystem Schreibversuche dahin aber nicht als kritisch betrachtet und einfach verwirft.
Was hier wichtigerweise const ist, sind übrigens Stringliterale, nicht Strings allgemein, und dass ein Zeiger variabel ist, heißt nicht, dass auch das, worauf er zeigt, variabel ist.
C++: |
char const *p = "foo"; ++p;
|
ist legaler Code, p zeigt danach auf "oo" - const bezieht sich immer nur auf das, was direkt zu seiner Linken steht (es sei denn, es steht ganz links, dann bezieht es sich auf das, was direkt zu seiner Rechten steht). Ein konstanter Zeiger wäre
C++: |
char const *const p = "foo";
|
...und dann funktioniert auch ++p nicht mehr.
Wie lange Literale und vergleichbare Daten im Speicher liegen bleiben, ist compiler- und laufzeitabhängig. Es kann aber durchaus sein, dass sie für die Dauer des Prozesses vorhanden bleiben. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra Dieser Post wurde am 08.08.2009 um 13:36 Uhr von 0xdeadbeef editiert. |