I membri di una struttura globale o statica in C sono automaticamente inizializzati a zero, nello stesso modo in cui le variabili globali o statiche non inizializzate sono ?
Dallo standard C99 6.7.8 / 10 “Inizializzazione”:
Se un object con durata di archiviazione automatica non è inizializzato in modo esplicito, il suo valore è indeterminato. Se un object con durata di archiviazione statica non è inizializzato in modo esplicito, allora:
– se ha il tipo di puntatore, viene inizializzato su un puntatore nullo;
– se ha un tipo aritmetico, è inizializzato allo zero (positivo o senza segno);
– se è un aggregato, ogni membro viene inizializzato (in modo ricorsivo) secondo queste regole;
– se si tratta di un sindacato, il primo membro nominato viene inizializzato (in modo ricorsivo) in base a queste regole
Poiché i globals e le strutture statiche hanno una durata di archiviazione statica, la risposta è sì – sono zero inizializzati (i puntatori nella struttura verranno impostati sul valore del puntatore NULL, che di solito è zero bit, ma in senso stretto non è necessario).
Lo standard C ++ 2003 ha un requisito simile (3.6.2 “Inizializzazione di oggetti non locali”):
Gli oggetti con durata di memorizzazione statica (3.7.1) devono essere inizializzati a zero (8.5) prima di ogni altra inizializzazione.
Qualche tempo dopo l’inizializzazione dello zero ha luogo, i costruttori vengono chiamati (se l’object ha un costruttore) sotto le regole un po ‘più complicate che governano i tempi e l’ordine di quelle chiamate.
Le variabili locali non sono inizializzate.
struct foobar { int x; }; int main(void) { struct foobar qux; /* qux is uninitialized. It is a local variable */ return 0; }
le variabili locali statiche sono inizializzate a 0 (zero)
struct foobar { int x; }; int main(void) { static struct foobar qux; /* qux is initialized (to 0). It is a static local variable */ return 0; }
Le variabili globali sono inizializzate a 0 (zero)
struct foobar { int x; }; struct foobar qux; /* qux is initialized (to 0). It is a global variable */ int main(void) { return 0; }
Una struct
non è diversa in questo modo di una normale variabile C statica. La memoria riservata per quella struct
è completamente inizializzata su 0 se è statica.
Sì, tutti i dati globali vengono azzerati, compresi i membri di strutture, classi e sindacati.
Tutti i dati nella parte globale del programma sono impostati su zero.
Il segmento BSS noto anche come dati non inizializzati inizia alla fine del segmento dati e contiene tutte le variabili globali non inizializzate e le variabili statiche che vengono inizializzate a zero per impostazione predefinita. Ad esempio una variabile dichiarata static int i; sarebbe contenuto nel segmento BSS.
Segmento Bss .
Non so perché è così difficile provarlo da solo.