2010-07-30 8 views
13

En C99 (y no en C++), es posible inicializar estructuras con esta sintaxis:¿Qué sucede con los campos no nombrados por un inicializador designado?

struct info 
{ 
    char name[8+1]; 
    int  sz; 
    int  typ; 
}; 

struct info arr[] = 
{ 
    [0] = { .sz = 20, .name = "abc" }, 
    [9] = { .sz = -1, .name = "" } 
}; 

¿Qué ocurre con los campos especificados?

+2

Estoy bastante seguro de que están 0 inicializados. Pero también estoy seguro de que alguien más será más rápido para encontrar la porción de la especificación C99 que lo hace así. ... ¡Y tenía razón! – torak

Respuesta

23

Se han puesto a cero. De la norma C99 § 6.7.8 (inicialización)/21,

Si hay menos inicializadores en una lista corsé-cerrado que elementos o miembros de un agregado o menos caracteres en una cadena literal utilizan para inicialice una matriz de tamaño conocido que no haya elementos en la matriz, el resto del agregado se inicializará implícitamente de la misma manera que los objetos que tienen una duración de almacenamiento estática.

+0

Exactamente lo que quería saber, complete con presupuesto estándar. ¡Gracias! –

+3

@Matt Joiner: ¿Hubo alguna vez alguna duda? Ah, y para completar, vea §6.7.8 (Inicialización)/10, que establece de manera efectiva que dicho almacenamiento estático es NULL/0 inicializado. – torak

+2

Una consecuencia útil de este hecho es que '{0}' es un cero inicializador universal que se puede usar para cualquier tipo agregado (y en realidad cualquier tipo, IIRC, aunque algunos compiladores pueden dar advertencias si se usa para tipos simples) –

Cuestiones relacionadas