2011-01-10 6 views
2

In C, von was ich verstehe, werden Primitive wie Ints und Floats auf 0 initialisiert, wenn sie zuerst deklariert werden. Dasselbe gilt, wenn eine Struktur deklariert wird, die Primitive enthält. Ich habe Probleme, einen einfachen Weg zu finden, um zu überprüfen, ob Primitive nicht initialisiert sind oder nicht.Einfache Möglichkeit zu prüfen, ob Primitive nicht initialisiert ist?

Angenommen, ich habe eine Instanzvariable vom Typ int in einer Headerdatei deklariert. Ich muss diese Variable in meinem Implementierungscode verwenden, und es ist wichtig für mich zu wissen, ob dieser Wert initialisiert wurde oder nicht. Die Überprüfung gegen Null ist nicht wirklich eine Option, denn wenn dieser Wert wirklich Null sein soll, habe ich einen Wert, der bereits geändert wurde, reinitialisiert. Die Überprüfung gegen NULL funktioniert auch nicht, weil es kein Zeiger ist.

Die einzige Lösung, die ich gefunden habe, initialisiert die Variable im ersten Teil des ausführbaren Codes auf einen Wert, von dem ich weiß, dass er nie für den Rest des Programms relevant sein wird. Wenn der Wert beispielsweise nie unter Null liegt, initialisiere ich ihn auf -1, um zu wissen, dass er noch nicht initialisiert wurde. Dies scheint jedoch sehr umständlich zu sein und kann zu Problemen führen, wenn sich der Wertebereich ändert, dem die Variable zugewiesen werden kann.

Irgendwelche interessanten Vorschläge für diese Art von Problem? Danke im Voraus!

+0

eine nicht initialisierte Variable ist eine UB. Wenn Sie den Schalter -Wall (gcc) übergeben, können Sie jede nicht initialisierte Variable verfolgen. Der gcc meldet etwas wie folgt: 'ddd.c: 8: warning: 'i' wird in dieser Funktion nicht initialisiert ' –

Antwort

7

Ihr Verständnis ist falsch. Lokale Variablen sind nicht initialisiert, unabhängig davon, ob sie int oder float sind.

Nur static Variablen werden auf Null initialisiert. Sie sollten alles vor der Verwendung initialisieren. Selbst wenn Sie glauben, dass Ihre Implementierung die Variable initialisiert, sollten Sie sich nicht darauf verlassen. Der Standard garantiert nichts. Die Verwendung einer nicht initialisierten Variablen ist ein undefiniertes Verhalten.

+0

Danke für die Korrektur, aber das beantwortet meine Frage nicht. Worin genau sollte ich meine Instanzvariable initialisieren, wenn der Wert erst nach einer späteren Prozedur zugewiesen wird? Wie würde ich prüfen, ob es in anderen Verfahren initialisiert oder nicht initialisiert ist? – zanneth

+0

@Zanneth: Sie sollten die Variable selbst nicht überprüfen. Sie sollten Ihre Variablen vor der Verwendung immer initialisieren. Wenn Sie aus irgendeinem Grund auf einen verzögerten Initialisierungsmechanismus angewiesen sind, sollten Sie ein Flag (entweder in der gleichen Variablen, mit einem Wert wie -1, wenn es außerhalb des Bereichs akzeptabler Werte liegt, oder mit einem separaten booleschen Flag, das den Wert enthält) beibehalten verfolgt die Initialisierung der Variablen). –

2

Nur globale Primitive, Zeiger und Datenstrukturen werden mit Null initialisiert; lokale Variablen oder malloc() 'd Speicher ist nicht.

0

Es gibt keinen Unterschied zwischen der Null, mit der ein Objekt mit statischer Speicherdauer initialisiert wird, und einer Null, die der Code explizit festgelegt hat. Eine Null ist nur eine Null.

Alles, was Sie tun können, ist es explizit initialisieren mit einer Nicht-Null-nicht-gültigen Zahl (in der .c-Datei, die es definiert):

foo.h:

extern double foo; 

foo.c:

double foo = NAN; 

Oder alternativ begleiten sie mit einem Flag-Variable, die, wenn zeigt es initialisiert:

foo.h:

extern double foo; 
extern int foo_initialised; 

foo.c:

double foo; 
int foo_initialised; 
Verwandte Themen