web-dev-qa-db-de.com

Wie setzt Array [100] = {0} das gesamte Array auf 0?

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.

140
mahesh

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

161
bk1e

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.

35
qrdl

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.

27
lakshmanaraj

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.

17
gallier2