Was sind primitive Typen, die standardmäßig in C initialisiert werden?

7

Ich hatte gerade Apples C / C ++ - Compiler initialisiert einen Float auf einen Wert ungleich Null (ca. "-0.1").

Das war eine große Überraschung - und geschah nur gelegentlich (aber zu 100% wiederholbar, wenn Sie vorher die gleichen Funktionsaufrufe / Argumente durchführten). Es hat lange gedauert, um aufzuspüren (mithilfe von Assertions).

Ich hatte gedacht, dass Floats Null-initialisiert wurden. Googeln deutet darauf hin, dass ich an C ++ dachte (was natürlich viel genauer ist - siehe SO: Was sind primitive Typen standardmäßig in C ++ initialisiert? ).

Aber vielleicht ist Apples Entschuldigung hier, dass ihr Compiler im C-Modus läuft ... also: was ist mit C? Was soll passieren und (was noch wichtiger ist) Was ist typisch?

(Natürlich hätte ich es manuell initialisieren sollen - normalerweise - aber in diesem einen Fall habe ich versagt. Ich habe aber nicht erwartet, dass es explodiert!)

(Google erweist sich bei jeder Diskussion als schlechter als nutzlos - ihre aktuelle Suche weigert sich, "C" ohne "C ++" anzuzeigen. Hält die Entscheidung, dass ich zu dumm bin und sogar meine Eingaben ignoriere, selbst wenn ich im erweiterten Modus arbeite)

Hier ist das eigentliche Quellenbeispiel, wo es passiert ist. Zuerst dachte ich, es könnte ein Problem mit den Definitionen von MAX und ABS geben (vielleicht führt MAX (ABS, ABS) nicht immer das, was Sie erwarten würden?) ... aber mit Behauptungen und Debugger graben, fand ich schließlich das Fehlen Initialisierung - dieser Float wurde SEHR gelegentlich auf Wert ungleich null gesetzt):

%Vor%     
Adam 10.04.2012, 13:17
quelle

5 Antworten

17

Nur Objekte mit statischer Speicherdauer werden auf 0 initialisiert, wenn kein expliziter Initialisierer vorhanden ist.

%Vor%

Objekte mit automatischer Speicherdauer (wie h im obigen Beispiel), die nicht explizit initialisiert werden, haben einen unbestimmten Wert. Lesen ihres Wertes ist undefiniertes Verhalten.

EDIT: der Vollständigkeit halber, da C11-Objekte mit Thread-Speicherdauer auch auf 0 initialisiert werden, wenn kein expliziter Initializer vorhanden ist.

    
ouah 10.04.2012, 13:23
quelle
9

Der relevante Teil der Norm ist §6.7.9 Absatz 10:

  

Wenn ein Objekt mit automatischer Speicherdauer nicht explizit initialisiert wird, ist sein Wert unbestimmt.

Wenn Ihre Variable stattdessen Thread- oder statische Speicherdauer hat, wird der nächste Teil des Absatzes wirksam:

  

Wenn ein Objekt mit statischer oder Thread-Speicherdauer nicht explizit initialisiert wird, dann:

     

- Wenn es einen Zeigertyp hat, wird es mit einem Nullzeiger initialisiert;

     

- Wenn es einen arithmetischen Typ hat, wird es initialisiert auf (positiv oder vorzeichenlos) Null;

     

...

Ich würde auch bemerken, dass Sie die Warnungen Ihres Compilers (speziell die Warnung für nicht initialisierte Variablen) aktivieren sollten, da dies das Problem für Sie sofort identifiziert haben sollte.

    
Stephen Canon 10.04.2012 13:24
quelle
5

Statische Variable würde auf Null initialisiert werden, aber ich vermute, dass Sie über eine lokale Variable sprechen (dh Stack oder automatisch) - diese werden nicht für Sie initialisiert, sondern erhalten den Wert, der ist in diesem Speicher auf dem Stapel.

    
Nikolai Fetissov 10.04.2012 13:24
quelle
1

Ich musste meinen K & R für diese Antwort herausziehen:

Wenn keine explizite Initialisierung erfolgt, werden externe und statische Variablen garantiert auf Null initialisiert; Automatische und Registervariablen haben undefinierte Anfangswerte (d. h. "Müll").

    
Mike Z 10.04.2012 13:27
quelle
0

Ich glaube nicht, dass irgendeiner der Standards für C anfängliche Werte für Variablen im Allgemeinen definiert. Dies würde im Einklang mit der allgemeinen Philosophie und Anwendungsdomäne für C - Programmierung für Erwachsene stehen, die eines Tages Grund haben wollen, dass ihr Compiler keine Variable für sie initialisiert und weiß, dass sie dafür verantwortlich sind initialisieren ihre eigenen Variablen.

    
High Performance Mark 10.04.2012 13:24
quelle

Tags und Links