Pointer auf undefinierten Bereich...
-
Mein Gedankengang war folgender: da solche Anweisungen undefiniertes Verhalten hervorrufen, muß das dann wahrscheinlich vom Compiler geregelt werden (was dann von Compiler zu Compiler variieren kann). Beim Compiler von Microsoft ist es nun so, daß du scheinbar eine Speicherstelle zugewiesen kriegst, allerdings bin ich mir nicht sicher, ob dieser Speicher im Laufe des Programms nicht einfach überschrieben wird. Deswegen würde ich solches "Verhalten" am liebsten "abstellen" und einen Absturz produzieren. Meine Frage war nun einfach, ob es so ein Flag gibt oder nicht.
-
D-U-D-E schrieb:
da solche Anweisungen undefiniertes Verhalten hervorrufen
bitte schreib doch mal klar und deutlich hin, welche anweisungen du meinst.
der code, den du gepostet hast, ruft kein undefiniertes verhalten hervor.
-
suma dartson schrieb:
D-U-D-E schrieb:
da solche Anweisungen undefiniertes Verhalten hervorrufen
bitte schreib doch mal klar und deutlich hin, welche anweisungen du meinst.
der code, den du gepostet hast, ruft kein undefiniertes verhalten hervor.Willst du mir sagen, daß
char *t = 0; if (!t) t = "test";
standardkonform ist? Jetzt bin ich allerdings wirklich verwirrt.
-
D-U-D-E schrieb:
Willst du mir sagen, daß
char *t = 0; if (!t) t = "test";
Das ist aus dem Grunde standardkonform, weil das Ergebnis von "test" ein Zeiger auf ein Zeichenliteral ist, welches die gesamte Programmlaufzeit überdauert.
-
D-U-D-E schrieb:
Willst du mir sagen, daß
char *t = 0; if (!t) t = "test";
standardkonform ist? Jetzt bin ich allerdings wirklich verwirrt.
Wo siehst du denn da ein Problem?
t wird mit Null initialisert, und verweist am Ende auf das Stringliteral "test".
-
Also wird das Literal "test" in den Speicher gelegt und t darauf umgebogen, richtig?
-
Das hat zwar nichts mit biegen zu tun, aber ja:
t
wird mitNULL
initialisert, und verweist am Ende auf das Stringliteral"test"
.cheers, Swordfish
-
Okay, soweit so gut
Aber wieso klappt das zum Beispiel nicht mit einem Integer?
-
D-U-D-E schrieb:
Okay, soweit so gut
Aber wieso klappt das zum Beispiel nicht mit einem Integer?
Was genau?
int a = 0; a = 12;
Klappt doch
Nochmal zum Hintergrund: "test" ist ein Zeichenkettenliteral in ReadOnly-Speicher des Programms. Du weist hier dem Zeiger zunächst den Wert 0 und dann den Wert "Adresse des Literals" zu. Bei dem Integer-Beispiel weist Du dem Integer zunächst den Wert 0 und dann den Wert 12 zu.
int *a = 0; *a = 12
Das ist eine völlig andere Situation. Du weist hier dem Zeiger zunächst den Wert 0 zu und dann dem, worauf er zeigt den Wert 12. Das ist undefiniert. Es wäre aber auch undefiniert wenn der Zeiger nicht den Wert 0 hätte.
-
Okay, Frage erledigt
Danke!