inicializar - La inicialización de variables estáticas en C
variables externas en c (4)
Tengo una pregunta sobre la inicialización de las variables estáticas en C. Sé si declaramos una variable estática global que por defecto el valor es 0
. Por ejemplo:
static int a; //although we do not initialize it, the value of a is 0
pero ¿qué pasa con la siguiente estructura de datos?
typedef struct
{
int a;
int b;
int c;
} Hello;
static Hello hello[3];
¿Están todos los miembros de cada estructura de hello[0]
, hello[1]
, hello[2]
inicializados como 0
?
Añadiría que las variables estáticas (o matrices) se clasifican en dos tipos.
Inicializados son los que reciben valor del código en el momento de la compilación. Estos generalmente se almacenan en DS aunque esto es específico del compilador.
El otro tipo son estáticos no inicializados que se inicializan en tiempo de ejecución y se almacenan en el segmento BSS, aunque nuevamente esto es específico del compilador.
Sí, las variables estáticas de ámbito de archivo se inicializan a cero, incluidos todos los miembros de estructuras, matrices, etc.
Vea esta pregunta para referencia (votaré para cerrar esto como un duplicado, también).
Editar: esta pregunta está recibiendo respuestas mucho mejores, por lo que votaré para cerrar esa pregunta como un duplicado de esto , en su lugar.
Como referencia, aquí está el enlace C de Preguntas Frecuentes de la respuesta aceptada de esa pregunta, aunque, por supuesto, los estándares C99 y C11 vinculados aquí son canónicos.
Sí, lo son, siempre que tengan una duración de almacenamiento estática o de subprocesos.
C11 (n1570), § 6.7.9 Inicialización # 10
Si un objeto que tiene una duración de almacenamiento estática o de subprocesos no se inicializa explícitamente, entonces:
[...]
- si tiene tipo aritmético, se inicializa a cero (positivo o sin signo);
- si es un agregado, cada miembro se inicializa (recursivamente) de acuerdo con estas reglas, y cualquier relleno se inicializa a cero bits;
[...]
Sí, todos los miembros se inicializaron para objetos con almacenamiento estático. Ver 6.7.8 / 10 en el Estándar C99 (documento PDF)
Si un objeto que tiene una duración de almacenamiento automática no se inicializa explícitamente, su valor es indeterminado. Si un objeto que tiene una duración de almacenamiento estática no se inicializa explícitamente , entonces:
- si tiene tipo de puntero, se inicializa a un puntero nulo;
- si tiene tipo aritmético, se inicializa a cero (positivo o sin signo);
- si es un agregado, cada miembro se inicializa (recursivamente) de acuerdo con estas reglas;
- si es una unión, el primer miembro nombrado se inicializa (recursivamente) de acuerdo con estas reglas.
Para inicializar todo en un objeto, ya sea static
o no, a 0, me gusta usar el inicializador de cero universal
sometype identifier0 = {0};
someothertype identifier1[SOMESIZE] = {0};
anytype identifier2[SIZE1][SIZE2][SIZE3] = {0};