Wie füllt der Compiler Werte aus char array[100] = {0};
? Was ist die Magie dahinter?
Ich wollte wissen, wie der interne Compiler initialisiert wird.
c++
c
compiler-construction
Namratha Patil
quelle
quelle
Antworten:
Es ist keine Magie.
Das Verhalten dieses Codes in C wird in Abschnitt 6.7.8.21 der C-Spezifikation ( Online-Entwurf der C-Spezifikation ) beschrieben: Für die Elemente, die keinen angegebenen Wert haben, initialisiert der Compiler Zeiger auf NULL und arithmetische Typen auf Null ( und wendet dies rekursiv auf Aggregate an).
Das Verhalten dieses Codes in C ++ wird in Abschnitt 8.5.1.7 der C ++ - Spezifikation ( Online-Entwurf der C ++ - Spezifikation ) beschrieben: Das Compiler-Aggregat initialisiert die Elemente, die keinen bestimmten Wert haben.
Beachten Sie außerdem, dass Sie in C ++ (aber nicht in C) eine leere Initialisierungsliste verwenden können, wodurch der Compiler alle Elemente des Arrays aggregiert und initialisiert:
Schauen Sie sich die folgende Frage an, welche Art von Code der Compiler dabei generieren könnte: Seltsame Assembly aus der Array-0-Initialisierung
quelle
Die Implementierung liegt bei den Compiler-Entwicklern.
Wenn Ihre Frage lautet "Was passiert mit einer solchen Deklaration?", Setzt der Compiler das erste Array-Element auf den von Ihnen angegebenen Wert (0) und alle anderen werden auf Null gesetzt, da dies ein Standardwert für ausgelassene Array-Elemente ist.
quelle
Wenn Ihr Compiler GCC ist, können Sie auch die folgende Syntax verwenden:
Bitte schauen Sie unter http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Designated-Inits.html#Designated-Inits nach und beachten Sie, dass dies eine compilerspezifische Funktion ist.
quelle
Es hängt davon ab, wo Sie diese Initialisierung platzieren.
Wenn das Array statisch ist wie in
dann ist es der Compiler, der die 100 0 Bytes im Datensegment des Programms reserviert. In diesem Fall hätten Sie den Initialisierer weglassen können.
Wenn Ihr Array automatisch ist, ist es eine andere Geschichte.
In diesem Fall haben Sie bei jedem Aufruf der Funktion foo ein verstecktes Memset.
Der obige Code entspricht
und wenn Sie den Initialisierer weglassen, enthält Ihr Array zufällige Daten (die Daten des Stapels).
Wenn Ihr lokales Array wie in statisch deklariert ist
dann ist es technisch der gleiche Fall wie beim ersten.
quelle