I membri di una struttura globale in C sono inizializzati a zero?

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.