2009-04-01 11 views

risposta

26

punto 8.5.1.7 del progetto di norma:

-7- Se ci sono meno inizializzatori nella lista che ci sono membri nell'aggregato , poi ognuno di me mber not inizializzato esplicitamente deve essere inizializzato in modo predefinito (dcl.init). [Esempio:

struct S { int a; char* b; int c; }; 
S ss = { 1, "asdf" }; 

ss.a inizializza con 1, ss.b con "asdf", e ss.c con il valore di una espressione della forma int(), cioè, 0 .]

+2

I puntatori verranno inizializzati su NULL correttamente? – user10607

3

No. è garantito a 0.

+0

+1 risposta corretta. –

24

È garantito essere 0 se è parzialmente inizializzato, come inizializzatori matrice. Se non è inizializzato, sarà sconosciuto.

struct T t; // t.x, t.y will NOT be initialized to 0 (not guaranteed to) 

struct T t = {42}; // t.y will be initialized to 0. 

Allo stesso modo:

int x[10]; // Won't be initialized. 

int x[10] = {1}; // initialized to {1,0,0,...} 

Esempio:

// a.c 
struct T { int x, y }; 
extern void f(void*); 
void partialInitialization() { 
    struct T t = {42}; 
    f(&t); 
} 
void noInitialization() { 
    struct T t; 
    f(&t); 
} 

// Compile with: gcc -O2 -S a.c 

// a.s: 

; ... 
partialInitialzation: 
; ... 
; movl $0, -4(%ebp)  ;;;; initializes t.y to 0. 
; movl $42, -8(%ebp) 
; ... 
noInitialization: 
; ... ; Nothing related to initialization. It just allocates memory on stack. 
+0

Ottima risposta con l'output dell'esempio del compilatore. È davvero difficile decidere se accettare la risposta di questo o bb che cita la parte rilevante delle specifiche. Vorrei poter accettare entrambi. – VoidPointer

+1

Si noti che se la variabile è globale, è garantito l'inizializzazione a zero su Unix anche senza inizializzatore. È una garanzia Unix che sfortunatamente non si trova su Windows. – Juliano

+0

(OT) che il linguaggio assembly di GCC è davvero brutto. – nothrow

Problemi correlati