Was steht hier auf dem Stack
-
Hallo Forum,
aus Langeweile bin ich ein bißchen am Rumbastelt.
int main() { char *x; // void *x; x: int z=66; std::cout << "Hallo "; int zu=66; int *zz=&z; for (int i=0; i<200; i++, zz--) { printf("%c", *zz); } goto x; }Mit diesem Programm kann ich mir anschauen was so auf dem Stack liegt. Die Ausgabe beinhaltet zwei B's dicht nebeneinander. Also der Inhalt von z und zu.
Nun möchte ich mir ansehen wie mein Programm im Speicher aussieht. Vielleicht steht ja "Hallo" da irgendwo.
int main() { char *x; // void *x; x: int z=66; std::cout << "Hallo "; int zu=66; for (int i=0; i<200; i++, x++) { // xx-- printf("%c", *x); } goto x; }Ich bekomme aber immer eine Zugriffsverletzung. Ist der Programmspeicher pauschal von Mammi geschützt worde?

Gibt es da einen Trick?Vielen Dank
Tim
-
Argh! Der korrekte Titel sollte heißen: Möchte meinen Programmcode sehen.
-
Du dereferenzierst im zweiten Programm den Zeiger x, jedoch weißt du diesem keinen Wert zu. Er enthält also einen undefinierten Wert - auf welchen du zugreifst. Deswegen stürzt dein Programm mit hoher Wahrscheinlichkeit (Aber nicht immer) ab.
Dies sollte dir dein Compiler aber auch als Warnung mitteilen... Du solltest das Warnungslevel immer auf die höchste Stufe stellen. Unter GCC wärend dies die Optionen -ansi -pedantic -Wall -Werror.
Außerdem ist ein Debugger die deutlich bessere Wahl wenn du dir die internen Daten anschauen willst. Der Stack ist übrigens implementationsabhängig.
-
Aber in x ist doch die Label Adresse gespeichert? Wenn ich mit der Maus rüberfahre (VS Express) enthält x die Goto Adresse.
-
Gibt es einen Trick irgendwie anders an die Label Adresse zu kommen?
-
Du weißt der Variable x keinen Wert zu, deswegen undefinierter Wert.
Das Label existiert zur Laufzeit nicht mehr. Der Goto-Befehl wird zur Laufzeit mit einem unbedignten Sprung zu einer Addresse übersetzt - die Addresse wo das Label steht.
-
Ok. War eh nur Spielerei...