[Anfängerfrage-Zeiger] Jungfräulicher Speicher ist immer 0
-
Hallihallo!
Ich bin gerade dabei nach längerer Zeit mal wieder in c++ reinzuschnuppern. Nun bearbeite ich gerade Zeiger und wundere mich...
#include <iostream> int main() { int *pi = new int; cout << "Inhalt von Speicher bei *pi : " << *pi << endl; delete pi; return 0; }Der Wert bei *pi ist immer 0.
Ich hatte da ehrlich gesagt was anderes erwartet, z.B. einen zufälligen Wert.
Bevor ich mich darüber weiter wundere wende ich mich an euch. Woran kann es liegen? Das sehe ich doch richtig, dass ich auf einen zufälligen, oder einen sich zumindest ständig ändernden, Speicherbereich zeige, oder?Programmieren tue ich übrigens unter Linux mit der eclipse IDE (gcc 3.3.5). Spezielle Kernel features habe ich keine an, auch keine patches (grsecurity etc.) ...
Bin um Aufklärung dankbar.

Philipp
PS: Kann mir vielleicht auch wer sagen wie ich unter Linux einen Speicherdump erzeugen kann? Sowas könnte auch helfen..
-
Du zeigst mit pi auf einen neuen Speicherbereich, das ist gültig.
Danach dereferenzierst du allerdings den neuen Speicherbereich, das ist nichtmehr gültig und führt zu undefiniertem Verhalten.
Der Grund für das undefinierte Verhalten ist, dass vor jeder Benutzung einer Variable vorher eine Initialisierung stattfinden muss.
Undefiniertes Verhalten bedeutet in diesem Fall das dort sehr ungewöhnliche Zahlen für *pi ausgegeben werden.
Der Grund das bei dir immer eine 0 ausgegeben wird ist , vielleicht sogar nur Glück. Man kann und darf sich nicht darauf verlassen.
Schreibe einfachint *pi = new int(0);das erspart nachdenken.
-
cornettonuss schrieb:
Woran kann es liegen?
das betriebssystem hat deiner anwendung speicher gegeben, der genullt wurde. aus sicherheitsgründen. damit nich passwörter und so aus der anwendung noch drinliegen, die den speicher zuletzt benutzt hat.
du kriegst aber auch fein daten rein, wenn du selber mit new sachen alegst und mete delete löscht und dann nochmal deinen test durchführst.
-
Dies hängt mit der Art und Weise des Compilierens zusammen. Ich vermute mal du hast im Debug-Modus übersetzt. In diesem Modus werden durchaus Variablen auch initialisiert.
Musst es mal im Release-Modus versuchen...
-
Mathias schrieb:
Dies hängt mit der Art und Weise des Compilierens zusammen. Ich vermute mal du hast im Debug-Modus übersetzt. In diesem Modus werden durchaus Variablen auch initialisiert.
Musst es mal im Release-Modus versuchen...im release-modus wird er eher auf was sonderbares gestellt. nicht 0. damit man programmierfehler durtlicher bemerkt.