Wie füllt der Compiler Werte in char array[100] = {0};
? Was ist die Magie dahinter?
Ich wollte wissen, wie der Compiler intern initialisiert wird.
Wie füllt der Compiler Werte in char array[100] = {0};
? Was ist die Magie dahinter?
Ich wollte wissen, wie der Compiler intern initialisiert wird.
Das ist keine Zauberei.
Das Verhalten dieses Codes in C ist in Abschnitt 6.7.8.21 der C-Spezifikation beschrieben ( Online-Entwurf der C-Spezifikation ): Für die Elemente, die keinen bestimmten 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++ ist in Abschnitt 8.5.1.7 der C++-Spezifikation beschrieben ( Online-Entwurf der C++-Spezifikation ): Der Compiler aggregiert und initialisiert die Elemente, die keinen bestimmten Wert haben.
Beachten Sie auch, dass Sie in C++ (aber nicht in C) eine leere Initialisierungsliste verwenden können, was den Compiler veranlasst, alle Elemente des Arrays zu aggregieren und zu initialisieren:
char array[100] = {};
Was die Art des Codes betrifft, den der Compiler bei dieser Vorgehensweise erzeugen könnte, so werfen Sie einen Blick auf diese Frage: Seltsamer Aufbau von Array 0-Initialisierung
Die Implementierung obliegt den Compiler-Entwicklern.
Wenn Ihre Frage lautet: "Was passiert bei einer solchen Deklaration?" - Der Compiler setzt das erste Array-Element auf den Wert, den Sie angegeben haben (0), und alle anderen werden auf Null gesetzt, da dies ein Standardwert für ausgelassene Array-Elemente ist.
Wenn Ihr Compiler GCC ist, können Sie auch folgende Syntax verwenden:
int array[256] = {[0 ... 255] = 0};
Bitte beachten Sie http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Designated-Inits.html#Designated-Inits und beachten Sie, dass es sich um eine Compiler-spezifisch Funktion.
Es kommt darauf an, wo Sie diese Initialisierung platzieren.
Wenn das Array statisch ist, wie in
char array[100] = {0};
int main(void)
{
...
}
dann ist es der Compiler, der die 100 0 Bytes im Datensegement des Programms reserviert. In diesem Fall hätten Sie den Initialisierer weglassen können.
Wenn es sich um eine automatische Anordnung handelt, sieht die Sache anders aus.
int foo(void)
{
char array[100] = {0};
...
}
In diesem Fall haben Sie bei jedem Aufruf der Funktion foo ein verstecktes memset.
Der obige Code ist gleichbedeutend mit
int foo(void)
{
char array[100];
memset(array, 0, sizeof(array));
....
}
und wenn Sie den Initialisierer weglassen, enthält Ihr Array zufällige Daten (die Daten des Stacks).
Wenn Ihr lokales Array als statisch deklariert ist wie in
int foo(void)
{
static char array[100] = {0};
...
}
dann handelt es sich technisch gesehen um denselben Fall wie im ersten Fall.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.