Wie füllt der Compiler Werte in char array[100] = {0};
? Was ist die Magie dahinter?
Ich wollte wissen, wie der interne Compiler initialisiert wird.
Es ist keine Magie.
Das Verhalten dieses Codes in C ist in Abschnitt 6.7.8.21 der C-Spezifikation beschrieben ( Online-Entwurf von C spec ): 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 beschrieben ( Online-Entwurf der C++ - Spezifikation ): Der Compiler aggregiert die Elemente, die keinen angegebenen Wert haben.
Beachten Sie auch, dass Sie in C++ (aber nicht in C) eine leere Initialisierungsliste verwenden können, wodurch der Compiler alle Elemente des Arrays aggregiert und initialisiert:
char array[100] = {};
Welche Art von Code der Compiler dabei generieren könnte, erfahren Sie anhand der folgenden Frage: Seltsame Assembly aus Array 0-Initialisierung
Die Implementierung liegt bei den Compiler-Entwicklern.
Bei der Frage "Was passiert mit einer solchen Deklaration?" Setzt der Compiler das erste Array-Element auf den von Ihnen angegebenen Wert (0) und alle anderen auf Null, 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 schauen Sie auf http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Designated-Inits.html#Designated-Inits und beachten Sie, dass dies ein compilerspezifisches Feature.
Es kommt darauf an, wo Sie diese Initialisierung ablegen.
Wenn das Array statisch ist wie in
char array[100] = {0};
int main(void)
{
...
}
dann reserviert der Compiler die 100 0 Bytes im Datensegment des Programms. In diesem Fall hätten Sie den Initialisierer weglassen können.
Wenn Ihr Array automatisch ist, ist es eine andere Geschichte.
int foo(void)
{
char array[100] = {0};
...
}
In diesem Fall haben Sie bei jedem Aufruf der Funktion foo ein verstecktes Memset.
Der obige Code entspricht
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 Stapels).
Wenn Ihr lokales Array wie in als statisch deklariert ist
int foo(void)
{
static char array[100] = {0};
...
}
dann ist es technisch der gleiche Fall wie beim ersten.