Wieso haben meine Variablen Werte nach der Deklaration!?



  • Hallo,

    ich hab mir einige Variablen in einer Funktion deklariert und hab mit dem Debugger feststellen müssen, dass alle Variablen Werte haben, ohne dass ich ihnen einen zugewiesen habe. Erst dachte ich, dass ich vielleicht Werte über das Feldende geschrieben hatte und dadurch der Speicher überschrieben wird, aber das war nicht der Fall. Kann mir jemand sagen, wo ich nach den Ursachen für das Problem suchen sollte?

    Danke im voraus
    Alex



  • Das ist kein Problem;¹ der Wert von nicht initialisierten Variablen ist undefiniert.
    EDIT: Wenn die Debug-Kompileroptionen angeschaltet sind, wird z.B. beim VC++ jede uninitialisierte Variable mit Werten wie 0xCCCCCCCC belegt, damit Buffer Overruns erkannt werden können.

    ¹Semikolon



  • Daran kanns nur leider nicht liegen...
    Wenn ich z.B.

    int z;
    z++;
    

    Dann ist z bei mir "16"! Wie kann das sein???
    Oder ist es möglich, dass andere Programme von Windows mir einen üblen Streich spielen?



  • Wie aleph schon sagte, der Wert nicht initialisierter Variablen ist undefiniert. Will sagen, sie haben einen Wert (weil's anders gar nicht geht!) aber er ist nicht bekannt. Um dies zu vermeiden, initialisiere sie gleich bei der Deklaration mit einem Wert:

    int z(0);  // oder auch: "int z = 0;"
    ++z;
    

    Stefan.



  • Wenn Du eine Variable Deklarierst, wird vom Compiler Speicher reserviert. Und was in diesem Speicherbereich steht, weiss man nicht. Es befindet sich hier ein "zufälliges" Bitmuster. Wenn Du jetzt eine Variable deklarierst und ohne initialisierung abfragst, dann wird dieses Bitmuster vom Compiler für Deine Variable angenommen.
    Man kann also vorher nicht wissen, was das Programm für einen Wert ausspuckt.
    Ich habe das "zufällig" in Anführungszeichen gesetzt, da bei bestimmten Compilern das Bitmuster immer das selbe ist. Beim Microsoft C++ Compiler hat , wenn ich mich recht erinnere, eine nicht initialisierte Integer Variable immer einen Wert von 2 Milliarden irgendwas... Aber das ist von Compiler zu Compiler verschieden.
    Deshalb sollte man Variblen immer sinnvoll initialisieren.

    Gruß, Ralf.



  • Wenn ich mich recht erinnere gibt es auch noch einen Unterschied, ob die Variable global oder lokal deklariert wird. Global wird ihr der Wert 0 zugewiesen, ansonsten undefiniert.
    So ist es jedenfalls bei Borland Builder.

    MfG Erik


Anmelden zum Antworten