2009-04-01 14 views

Odpowiedz

26

pozycja 8.5.1.7 standardowego projektu:

-7- Jeśli istnieje mniej inicjalizatory na liście niż są członkowie w agregacie , to każdy ja mber nie jawnie zainicjowany będzie domyślnie zainicjalizowany (dcl.init). [przykład:

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

inicjuje ss.a 1, ss.b z "asdf" i ss.c o wartości w ekspresji Int kształtowy(), to znaczy, 0 .]

+2

Czy wskaźniki zostaną poprawnie zainicjowane na wartość NULL? – user10607

3

Nie jest gwarancją 0.

+0

+1 poprawna odpowiedź. –

24

Jest to gwarancją 0 jeśli jest częściowo zainicjowany, jak inicjalizatorów tablicy. Jeśli nie jest zainicjalizowany, będzie to nieznane.

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. 

Podobnie:

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

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

Próbka:

// 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

Świetna odpowiedź z przykładowym wyjściem kompilatora. Naprawdę ciężko jest zdecydować, czy przyjąć odpowiedź tego lub bb, która cytuje odpowiednią część specyfikacji. Chciałbym móc przyjąć oba. – VoidPointer

+1

Zauważ, że jeśli zmienna jest globalna, to jest gwarantowana inicjalizacja na zero w systemie Unix nawet bez inicjalizatora. Jest to gwarancja Unix, której niestety nie można znaleźć w systemie Windows. – Juliano

+0

(OT), że język asemblera GCC jest naprawdę brzydki. – nothrow

Powiązane problemy