2012-10-27 5 views
6

Cosa significa questo codice?Cosa succede quando è in corso l'inizializzazione parziale di una matrice di struct in C?

struct foo_t { 
    int a; 
    int b; 
} foo[10] = {{0,0}} 

foo [0] è {0,0}, ma per quanto riguarda il resto? Come lo gestisce lo standard C?

AGGIUNTO. Ho fondato una risposta esaustiva here. Penso che la mia domanda dovrebbe essere cancellata.

+0

possibile duplicato [C e C++: inizializzazione parziale della struttura automatica] (http://stackoverflow.com/questions/10828294/c-and-c-partial-initialization-of-automatic-structure) –

risposta

8

L'intero array verrà inizializzato con le strutture con il valore 0 per entrambi a e b. Questo è simile al seguente caso con un valore di base:

int foo[10] = {0}; 

Dove ogni intero nell'array sarà inizializzato con il valore 0.

La C99 norma prevede che:

Se ci sono meno inizializzatori in una lista tra graffe racchiuso che ci sono elementi o membri di un aggregato o meno caratteri in una stringa letterale utilizzati per inizializzare un matrice della nota dimensione rispetto agli elementi dell'array, il resto dell'aggregato deve essere inizializzato implicitamente come oggetti con durata di archiviazione statica.

+1

+1 per la citazione di std. –

2

Il valore 0 indica in genere la fine di un elenco. Con questo intendo che quando si itera una tale lista e si incontra questo valore, il giocattolo sa che si è arrivati ​​alla fine. Suppongo che chiunque abbia creato questo annuncio abbia qualcosa di simile nella sua mente. Se si esegue la ricerca nel codice, è possibile trovare un frammento di codice che imposta un valore zero dopo l'aggiunta di un valore nell'elenco.

+0

Purtroppo per il mio inglese. Ma intendo * come verrà inizializzata la struttura *. Sono interessante sul linguaggio, non su come l'autore vuole usare il codice sopra. Ho leggermente modificato la mia domanda. –

+0

Ok, eccolo. Un array come questo riserva un blocco di memoria nell'area dati del programma. Il compilatore in fase di compilazione inizializza questa memoria con 0s. Se è una variabile locale, il blocco globale viene copiato nello stack per inizializzarlo. Ricorda che questa matrice di strutture occupa un blocco di memoria consecutivo, quindi impostando tutti i byte su 0, si inizializza effettivamente l'array. Spero di essere riuscito a rispondere alla tua domanda. – Gus

Problemi correlati