In che modo il compilatore inserisce i valori char array[100] = {0};
? Qual è la magia dietro?
Volevo sapere come inizializza internamente il compilatore.
In che modo il compilatore inserisce i valori char array[100] = {0};
? Qual è la magia dietro?
Volevo sapere come inizializza internamente il compilatore.
Risposte:
Non è magia.
Il comportamento di questo codice in C è descritto nella sezione 6.7.8.21 della specifica C ( bozza online della specifica C ): per gli elementi che non hanno un valore specificato, il compilatore inizializza i puntatori su NULL e i tipi aritmetici su zero ( e ricorsivamente si applica agli aggregati).
Il comportamento di questo codice in C ++ è descritto nella sezione 8.5.1.7 della specifica C ++ ( bozza online della specifica C ++ ): il compilatore aggrega inizializza gli elementi che non hanno un valore specificato.
Inoltre, tieni presente che in C ++ (ma non in C), puoi utilizzare un elenco di inizializzatori vuoto, facendo in modo che il compilatore inizializzi in modo aggregato tutti gli elementi dell'array:
char array[100] = {};
Per quanto riguarda il tipo di codice che il compilatore potrebbe generare quando lo fai, dai un'occhiata a questa domanda: Strano assembly dall'inizializzazione dell'array 0
L'implementazione dipende dagli sviluppatori del compilatore.
Se la tua domanda è "cosa accadrà con tale dichiarazione", il compilatore imposterà il primo elemento dell'array sul valore che hai fornito (0) e tutti gli altri verranno impostati su zero perché è un valore predefinito per gli elementi dell'array omessi.
Se il tuo compilatore è GCC, puoi anche utilizzare la sintassi seguente:
int array[256] = {[0 ... 255] = 0};
Si prega di consultare http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Designated-Inits.html#Designated-Inits e notare che questa è una funzione specifica del compilatore .
Dipende da dove metti questa inizializzazione.
Se l'array è statico come in
char array[100] = {0};
int main(void)
{
...
}
quindi è il compilatore che riserva i 100 0 byte nel segmento di dati del programma. In questo caso avresti potuto omettere l'inizializzatore.
Se il tuo array è automatico, allora è un'altra storia.
int foo(void)
{
char array[100] = {0};
...
}
In questo caso ad ogni chiamata della funzione foo avrai un memset nascosto.
Il codice sopra è equivalente a
int foo(void)
{
char array[100];
memset(array, 0, sizeof(array));
....
}
e se si omette l'inizializzatore, l'array conterrà dati casuali (i dati dello stack).
Se l'array locale è dichiarato statico come in
int foo(void)
{
static char array[100] = {0};
...
}
quindi è tecnicamente lo stesso caso del primo.