sintaxis programa lenguaje funciones estructuras estructura ejemplo con arreglo array anidadas c struct initialization

programa - ¿Los miembros de una estructura global en C están inicializados a cero?



sintaxis de c++ (5)

¿Se garantiza que los miembros de una estructura global o estática en C se inicialicen automáticamente a cero, de la misma manera que las variables globales o estáticas sin inicializar ?


Del estándar C99 6.7.8 / 10 "Inicialización":

Si un objeto que tiene una duración de almacenamiento automático no se inicializa explícitamente, su valor es indeterminado. Si un objeto que tiene una duración de almacenamiento estático no se inicializa explícitamente, entonces:

- si tiene un 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

Dado que las estructuras globales y estáticas tienen una duración de almacenamiento estática, la respuesta es sí: están inicializadas en cero (los punteros en la estructura se establecerán en el valor del puntero NULO, que generalmente es de cero bits, pero estrictamente no tiene por qué serlo).

El estándar C ++ 2003 tiene un requisito similar (3.6.2 "Inicialización de objetos no locales"):

Los objetos con duración de almacenamiento estático (3.7.1) se inicializarán con cero (8.5) antes de que tenga lugar cualquier otra inicialización.

Algún tiempo después de que tenga lugar la inicialización cero, se llama a los constructores (si el objeto tiene un constructor) bajo las reglas algo más complicadas que rigen el tiempo y el orden de esas llamadas.


Las variables locales no están inicializadas.

struct foobar { int x; }; int main(void) { struct foobar qux; /* qux is uninitialized. It is a local variable */ return 0; }

Las variables locales estáticas se inicializan a 0 (cero)

struct foobar { int x; }; int main(void) { static struct foobar qux; /* qux is initialized (to 0). It is a static local variable */ return 0; }

Las variables globales se inicializan a 0 (cero)

struct foobar { int x; }; struct foobar qux; /* qux is initialized (to 0). It is a global variable */ int main(void) { return 0; }


Sí, todos los datos globales se ponen a cero, incluidos los miembros de estructuras, clases y sindicatos.


Todos los datos en la parte global del programa se ponen a cero.

El segmento BSS también conocido como datos no inicializados comienza al final del segmento de datos y contiene todas las variables globales no inicializadas y las variables estáticas que se inicializan a cero por defecto. Por ejemplo, una variable declarada estática int i; Estaría contenido en el segmento BSS.

Segmento Bss .

No sé por qué es tan difícil probarlo usted mismo por cierto.


Una struct no es diferente de esta manera que una variable C normal estática. La memoria reservada para esa struct se inicializa completamente a 0 si es una estática.