2012-11-06 5 views
32

Ho una domanda sull'inizializzazione delle variabili statiche in C. So che se dichiariamo una variabile statica globale che per impostazione predefinita il valore è 0. Ad esempio:L'inizializzazione delle variabili statiche in C

static int a; //although we do not initialize it, the value of a is 0 

ma per quanto riguarda la struttura dei dati:

typedef struct 
{ 
    int a; 
    int b; 
    int c; 
} Hello; 

static Hello hello[3]; 

sono tutti i membri di ogni struttura di hello[0], hello[1], hello[2] inizializzata come 0?

risposta

39

Sì, tutti i membri sono inizializzati per oggetti con memoria statica. Vedi 6.7.8/10 in C99 Standard (PDF document)

Se un oggetto con durata di memorizzazione automatica non è inizializzato in modo esplicito, il suo valore è indeterminato. Se un oggetto con durata di memorizzazione statica non è inizializzato in modo esplicito, quindi:
- se ha il tipo di puntatore, viene inizializzato su un puntatore nullo;
- se ha tipo aritmetico, è inizializzato allo zero (positivo o senza segno);
- se è un aggregato, ogni membro viene inizializzato (in modo ricorsivo) in base a queste regole;
- se è un unione, il primo membro nominato viene inizializzato (in modo ricorsivo) in base a queste regole .

Per inizializzare tutto in un oggetto, che si tratti di static o no, a 0, mi piace usare l'inizializzatore universale a zero

sometype identifier0 = {0}; 
someothertype identifier1[SOMESIZE] = {0}; 
anytype identifier2[SIZE1][SIZE2][SIZE3] = {0}; 
+0

Impressionante quando la risposta fa riferimento ai documenti standard. +1 –

1

Sì, lo sono, a patto di avere statico o durata della memorizzazione del thread.

C11 (n1570), § 6.7.9 inizializzazione # 10

Se un oggetto che ha una durata di stoccaggio statico o filo non è inizializzata esplicitamente, quindi:

[... ]

  • se ha tipo aritmetico, è inizializzato a zero (positivo o senza segno);
  • se è un aggregato, ogni membro viene inizializzato (in modo ricorsivo) in base a queste regole, e qualsiasi padding viene inizializzato su zero bit;

[...]

+1

La [bozza dello standard C11 (documento PDF)] (http://www.open-std.org/JTC1/sc22/wg14/www/docs/n1570.pdf) è disponibile gratuitamente online. – pmg

2

Sì, variabili statiche di file-scope sono inizializzate a zero, compresi tutti i membri di strutture, array, ecc

Vedi this question per riferimento (I' ll voto per chiudere questo come un duplicato, anche).


Edit: questa domanda è sempre risposte molto meglio, quindi sono di voto di chiudere che domanda come un duplicato di questo , invece.

Per riferimento, ecco lo C FAQ link dalla risposta accettata di quella domanda, anche se ovviamente gli standard C99 e C11 collegati qui sono canonici.

1

Vorrei aggiungere che le variabili statiche (o matrici) sono classificate in due tipi.

inizializzata sono quelli che vengono dati valore dal codice in fase di compilazione. Questi sono solitamente archiviati in DS sebbene questo sia specifico del compilatore.

L'altro tipo è statico non inizializzato statiche che sono inizializzate in fase di esecuzione e sono memorizzate nel segmento BSS anche se ancora una volta questo è specifico del compilatore.

BSS