Ungeklärte C++ - Standard int-Werte
Habe ich schon refactoring code-und ich bemerkte, dass einige wonky Verhalten, die eine nicht initialisierte int-array:
int arr[ARRAY_SIZE];
Ich einen break-point und es scheint, alle Werte standardmäßig auf -858993460. Gibt es etwas besonderes bei diesem Wert? Irgendwelche Ideen, warum Sie nicht standardmäßig auf 0?
- Sie brauchen, um mehr Kontext für diese Frage. Wenn diese globalen Variablen, dann ist die Laufzeit soll initialisiert Sie auf null automatisch. Wenn Sie lokal sind, dann nicht. (Dein problem ist wahrscheinlich letzteres, aber es ist unmöglich zu sagen, aus deiner Frage.)
- "berühmte Frage"
Du musst angemeldet sein, um einen Kommentar abzugeben.
-858993460 ist, in hex, CCCCCCCC, die von Visual Studio legt standardmäßig im DEBUG-MODUS. Dies macht es einfacher für Sie zu bemerken, dass Sie vergessen haben, initialisieren Sie die variable. Im release-Modus, es könnte alles sein.
Ich bin eigentlich nicht sicher, warum
mouseBufferX
ist nicht ein element der 10 Elemente (wenn diese nicht kompilieren und nicht 10 Elemente). Aber ich bin mir ziemlich sicher, dass der standard sagt, Statik initialisiert werden, bevor nonstatics. Wie auch immer, ich persönlich hasse es mitdefine
s undconst
s zu erklären, ints. Verwenden Sie ein enum statt.C++ nicht standardmäßig alles auf 0, so MÜSSEN Sie die Zuordnung etwas Wert, bevor Sie Sie verwenden. Statische Variablen sind Ausnahmen von dieser Regel, wie Sie sind standardmäßig auf null gesetzt. Aber ich werde beachten Sie, dass die Verwendung von statischen Variablen wird abgeraten, und einige Sprachen (wie C#) lassen Sie sich nicht zu erklären, statische Variablen in einer Funktion.
const int blah=val
aber wenn ich brauche eine Speicher-Adresse (was ich auch tun würde &bla zu), die 99.9999% der Zeit warum schreiben alle, dass aus. enum können Sie definieren es einfach. Auch das geht ohne zu sagen, initialisieren, und wenn es statisch oder nichtconst int var = A/C*100+somethingelse
und es war ein Fehler, die es im hintergrund verstecken sich vor mir. Ich kann mich nicht erinnern, was es war, aber ich erinnere mich daran, es wieder in VC6, so bin ich sicher, dass es nicht mehr anwenden, aber wenn ich es geändert enum bekam ich einen compile-Zeit-Fehler, anstatt eine seltsame int-Wert bc eine Warnung/Fehler versteckt. Auch das, was fred sagte. ints MÜSSEN verbrauchen Speicher (so können Sie Ihre Adresse, Referenz in plugins, etc), wo enums sind inlineGibt es keine "Standard" in C++ -- Variablen und array-Elemente, bis Sie initialisiert, indem Sie Ihren code, enthalten, was im Arbeitsspeicher war letzten.
In anderen Worten, wenn diese Variablen deklariert sind, wird ein Platz im Speicher reserviert ist, für deren Gebrauch. Die bits im Speicher übrig vom letzten mal, dass der Speicher verwendet wurde, sind immer noch da, wodurch Sie Ihre Variablen zunächst erscheinen, als ob Sie voll mit "Müll". Der Grund, dass der Speicher nicht immer genullt sofort ist die Geschwindigkeit-es dauert seine Zeit bis null Speicher.
Können Sie initialisieren das array mit einer Schleife, oder mit diesem trick (das Risiko, viel weniger lesbar):
Dies funktioniert, weil, wenn Sie eine Liste der Werte, die das array initialisiert werden, und es gibt weniger Literale Werte als die Anzahl der Elemente im array, die restlichen Elemente immer erhalten, initialisiert auf 0.
={0}
). Ich würde dies nur tun, bin ich gezwungen, zu verwenden, ein char-array für eine Zeichenkette.= {0}
wie Redewendungen, eigentlich; warum tun Sie sagen, es ist weniger gut lesbar? Obwohl, es wäre wahrscheinlich verdienen ein erläuternder Kommentar, wenn Sie den ersten Eintrag auf einen Wert ungleich null und setzt dabei auf den Nebeneffekt, dass der rest Nullen.Müssen Sie explizit die Werte für die array - Sie nicht "default" zu nichts.
Versuchen:
= {}
funktioniert in C++.C++ nicht initialisiert Variablen. Wenn ein Stück der Speicher ist reserviert für die variable, die chunk-Speicher ist als Links-ist, und enthält den Wert, den es hat, wenn es zugewiesen wurde.
Jedoch einige Compiler (g++, glaube ich) wird automatisch initialisiert Dinge zu 0 - aber verlassen Sie sich nicht auf dieses Verhalten, wie es wird Ihr code weniger tragbar.
Erhalten Sie ein array, um alle Werte initialisiert, ein Wert, Sie können dies tun:
Können Sie so viele Werte, wie Sie in der Initialisierungs-Liste und die Elemente zugeordnet werden, diese Werte.
Manchmal in einem debug-build, der compiler initialisieren Sie den Speicher auf einen bekannten Wert, um es einfacher zu erkennen, bugs. Wenn Ihr compiler dies tut, es sollte irgendwo dokumentiert sein.
Dies ist ganz im Ermessen des Compilers, da der standard keine Garantie für die Initialisierung auch immer in diesem Fall.
das ist eine ganz gefährliche Annahme, die Ihr macht.
auf ein guter compiler könnte man einen Konstanten default-Wert wie die nächsten to-infinity - (edit: oder 0xCCCCCCCC thx acidezombie24), sonst wirst du nur bekommen Zufallszahlen
IMMER initialisieren Sie Ihre Variablen
etwas wie