Unerklärliche C ++ - Standard-int-Werte

8

Ich habe etwas Code umgestaltet und ich habe etwas schiefes Verhalten bemerkt, das ein nicht initialisiertes int-Array betrifft:

%Vor%

Ich habe einen Haltepunkt gesetzt und es scheint, dass alle Werte auf -858993460 voreingestellt sind. Gibt es etwas Besonderes mit diesem Wert? Irgendwelche Ideen, warum sie nicht standardmäßig auf 0 setzen?

    
kbirk 06.06.2011, 01:10
quelle

6 Antworten

14

-858993460 ist, in hex, CCCCCCCC, die Visual Studio im DEBUG-MODUS als Standard setzt. Dies erleichtert es Ihnen festzustellen, dass Sie vergessen haben, die Variable zu initialisieren. Im Freigabemodus könnte es alles Mögliche sein.

Ich bin mir eigentlich nicht sicher, warum mouseBufferX kein Element von 10 Elementen ist (wenn das kompiliert wird und das sind nicht 10 Elemente). Aber ich bin mir ziemlich sicher, dass der Standard besagt, dass Statik vor Nichtstatik initialisiert wird. Wie auch immer, ich persönlich hasse die Verwendung von define s und const s, um Ints zu deklarieren. Verwenden Sie stattdessen eine Aufzählung.

C ++ setzt nichts auf 0, also MÜSSEN Sie etwas einen Wert zuweisen, bevor Sie es verwenden. Statische Variablen sind Ausnahmen von dieser Regel, da sie standardmäßig auf Null gesetzt sind. Aber ich werde bemerken, dass die Verwendung von statischen Variablen nicht empfohlen wird, und einige Sprachen (wie C #) nicht erlauben, statische Variablen in einer Funktion zu deklarieren.

    
user34537 06.06.2011, 01:19
quelle
17

Es gibt keinen "Standard" in C ++ - Variablen und Array-Elemente, bis sie von Ihrem Code initialisiert werden, enthalten alles, was zuletzt im Speicher war.

Mit anderen Worten, wenn diese Variablen deklariert werden, ist ein Speicherplatz im Speicher für ihre Verwendung reserviert. Die Bits im Speicher, die von der letzten Verwendung des Speichers übrig geblieben sind, sind immer noch vorhanden, was dazu führt, dass Ihre Variablen anfangs so erscheinen, als ob sie mit "Müll" gefüllt wären. Der Grund dafür, dass der Speicher nicht immer sofort auf Null gesetzt wird, ist die Geschwindigkeit - es braucht Zeit, um den Speicher auf Null zu setzen.

Sie können Ihr Array mit einer Schleife initialisieren oder diesen Trick verwenden (mit dem Risiko, viel weniger lesbar zu sein):

%Vor%

Dies funktioniert, weil, wenn Sie eine Liste von Werten verwenden, um das Array zu initialisieren, und weniger Literalwerte als die Anzahl der Elemente im Array vorhanden sind, die verbleibenden Elemente immer auf 0 initialisiert werden.

    
Cameron 06.06.2011 01:13
quelle
2

Sie müssen die Werte für das Array explizit festlegen - sie haben keinen Standardwert. Probieren Sie:

%Vor%     
Zabba 06.06.2011 01:13
quelle
2

C ++ initialisiert keine Variablen. Wenn ein Teil des Speichers für die Variable reserviert ist, wird dieser Teil des Speichers unverändert belassen und enthält den Wert, den er bei der Zuweisung hatte.

Allerdings werden einige Compiler (wie g ++, glaube ich) automatisch Dinge auf 0 initialisieren - aber hängen nicht von diesem Verhalten ab, da es Ihren Code weniger portabel macht.

Um ein Array zu veranlassen, alle Werte auf einen Wert initialisiert zu haben, können Sie dies tun:

%Vor%

Sie können in der Initialisierungsliste beliebig viele Werte angeben, und den Elementen werden diese Werte zugewiesen.

    
Seth Carnegie 06.06.2011 01:15
quelle
0

Bei einem Debug-Build initialisiert der Compiler manchmal den Speicher auf einen bekannten Wert, um das Erkennen von Fehlern zu erleichtern. Wenn Ihr Compiler dies tut, sollte es irgendwo dokumentiert werden.

Dies liegt vollständig im Ermessen des Compilers, da der Standard in diesem Fall keinerlei Initialisierung garantiert.

    
Mark Ransom 06.06.2011 01:17
quelle
0

das ist eine wirklich gefährliche Annahme, die Sie machen.

Bei einem guten Compiler erhalten Sie vielleicht einen konstanten Standardwert wie den am nächsten an -infinity (edit: oder 0xCCCCCCCC thx acidezombie24), sonst erhalten Sie nur Zufallszahlen

Initialisiere IMMER deine Variablen

etwas wie

%Vor%     
Jason Rogers 06.06.2011 01:17
quelle

Tags und Links