2013-04-15 14 views
6
#include <stdio.h> 
int a[100]; 
int main(){ 
    printf("%d",a[5]); 
    return 0; 
} 

Il codice sopra riportato stampa sempre '0' o è specifico del compilatore? Sto usando il compilatore gcc e ho ottenuto l'output come '0'.Le variabili globali sono sempre inizializzate a zero in C?

+0

C'è qualcosa? impedendoti di inizializzare la variabile sui valori che vuoi che siano? –

risposta

18

Sì, tutti i membri della a sono garantiti per essere inizializzato a 0.

Dalla sezione 3.5.7 della C89 standard di

Se un oggetto che ha una durata di stoccaggio statico non è inizializzata esplicitamente , viene inizializzato implicitamente come se a ogni membro con tipo aritmetico fosse assegnato 0 e ad ogni membro che ha il tipo di puntatore sia stata assegnata una costante puntatore nullo.

+0

Credo che questo sia dalla bozza ANSI C "X3"? Lo stesso testo vale ancora nello standard C, ma perché citare una fonte così vecchia e obsoleta? – Lundin

+0

@Lundin Era l'unica fonte che avevo a disposizione e pensavo che fosse ancora fatta per una risposta migliore di "Sì, lo standard (non referenziato) dice così". Ho fatto +1 su un riferimento a uno standard più moderno. – simonc

+2

Aha, beh la [bozza C11] (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf) è abbastanza facile da trovare in rete. Le differenze tra la bozza e lo standard C11 finale sono estetiche, a parte un [corrigendum minore] (http://stackoverflow.com/questions/13914050/what-is-c11-cor-12012/13914051#13914051). – Lundin

3

Sì. Qualsiasi variabile globale è inizializzata sul valore predefinito di quel tipo. 0 è il valore predefinito e viene automaticamente assegnato a qualsiasi tipo. Se si tratta di un puntatore, 0 diventa NULL

variabili globali arrivare spazio nel segmento di dati che viene azzerato.

È non specifico del compilatore ma definito nello standard C.

Quindi stampa sempre 0.

+0

XORing con se stesso è un dettagli di implementazione; non importa * come * le cose sono azzerate. – glglgl

+0

@glglgl Grazie ... :) – Sam

+3

Inoltre, dubito fortemente che qualsiasi implementazione moderna utilizzi XOR per svuotare la memoria, poiché potrebbe comportare operazioni di lettura aggiuntive, che è completamente inutile e aggiunge ai tempi di avvio dell'applicazione. XOR con se stesso funziona bene per la cancellazione dei registri su determinati processori che non hanno un'istruzione speciale per "impostare il registro su zero". Non è buono per impostare le regioni di memoria a zero. –

0

Non è specifico del compilatore. Il codice stamperà sempre 0.

1

La variabile globle è sempre initalizzata a zero in C?

Sì ed è definito nello standard C.

2

Gli oggetti di ambito file dichiarati senza inizializzatori espliciti sono inizializzati da 0 per impostazione predefinita (e su NULL per i puntatori).

Gli oggetti non statici nell'ambito del blocco dichiarati senza inizializzatori espliciti non vengono inizializzati.

7

"Variabili globali" sono definite allo file scope, al di fuori di qualsiasi funzione. Tutte le variabili definite nell'ambito del file e tutte le variabili dichiarate con la parola chiave static hanno qualcosa chiamato durata di archiviazione statica. Ciò significa che saranno allocati in una parte separata della memoria ed esistono per tutta la durata del programma.

Significa anche che è garantito l'inizializzazione a zero su qualsiasi compilatore C.

Dalla corrente C11 standard C 6.7.9/10:

" ...Se un oggetto con durata di memorizzazione statica o di thread non è inizializzato in modo esplicito , quindi:

- se ha il tipo di puntatore, viene inizializzato su un puntatore nullo;

- se ha tipo aritmetico, viene inizializzato a (positivo o unsigned) pari a zero;"

In pratica, questo significa che se si inizializza la variabile globale a un dato valore, avrà quel valore e verrà assegnato in un segmento di memoria solitamente denominato .data. Se non gli viene assegnato un valore, verrà assegnato in un altro segmento denominato .bss. Globali non verranno mai allocati nello stack

Problemi correlati