2010-07-30 9 views
13

In C99 (e non in C++), è possibile inizializzare le strutture utilizzando questa sintassi:Cosa succede ai campi non nominati da un inizializzatore designato?

struct info 
{ 
    char name[8+1]; 
    int  sz; 
    int  typ; 
}; 

struct info arr[] = 
{ 
    [0] = { .sz = 20, .name = "abc" }, 
    [9] = { .sz = -1, .name = "" } 
}; 

Cosa succede ai campi non specificati?

+2

Sono abbastanza sicuro che siano 0 inizializzati. Ma sono anche sicuro che qualcun altro sarà più veloce nel trovare la parte delle specifiche C99 che lo rende così. ... E avevo ragione! – torak

risposta

23

Sono azzerati. Dallo standard C99 § 6.7.8 (Inizializzazione)/21,

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 array di dimensioni note rispetto a quelli presenti nell'array, il resto dell'aggregato deve essere inizializzato implicitamente come oggetti con durata di archiviazione statica.

+0

Esattamente quello che volevo sapere, completo di preventivo standard. Grazie! –

+3

@Matt Joiner: ci sono mai stati dubbi? Oh, e per completezza vedi §6.7.8 (Inizializzazione)/10, che afferma efficacemente che tale memoria statica è inizializzata NULL/0. – torak

+2

Una conseguenza utile di questo fatto è che '{0}' è un inizializzatore zero universale che può essere utilizzato per qualsiasi tipo di aggregato (e in realtà qualsiasi tipo, IIRC, anche se alcuni compilatori potrebbero dare avvertimenti se è usato per tipi semplici). –

Problemi correlati