2009-04-01 7 views

Respuesta

26

artículo 8.5.1.7 del borrador de la norma:

-7- Si hay menos inicializadores en la lista que hay miembros en el agregado , entonces cada uno de mí mber no explícitamente inicializado será inicializado por defecto (dcl.init). [Ejemplo:

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

inicializa ss.a con 1, ss.b con "asdf", y ss.c con el valor de una expresión de la forma int(), es decir, 0 .]

+2

¿Se inicializarán los punteros a NULL correctamente? – user10607

3

No. que se garantiza que sea 0.

+0

+1 respuesta correcta. –

24

Está garantizado que ser 0 si está parcialmente inicializado, al igual que inicializadores de matriz. Si no está inicializado, será desconocido.

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. 

mismo modo:

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

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

muestra:

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

Excelente respuesta con la salida de ejemplo del compilador. Es realmente difícil decidir si aceptar la respuesta de este o de la BB que cita la parte relevante de la especificación. Desearía poder aceptar ambos. – VoidPointer

+1

Tenga en cuenta que si la variable es global, se garantiza que se inicializará a cero en Unix incluso sin inicializador. Es una garantía de Unix que desafortunadamente no se encuentra en Windows. – Juliano

+0

(OT) que el lenguaje ensamblador de GCC es realmente feo. – nothrow

Cuestiones relacionadas