¿Las variables globales siempre se inicializan a cero en C? [duplicate]

4 minutos de lectura

avatar de usuario
Alex

#include <stdio.h>
int a[100];
int main(){
    printf("%d",a[5]);
    return 0;
}

¿El código anterior siempre imprime ‘0’ o es específico del compilador? Estoy usando el compilador gcc y obtuve el resultado como ‘0’.

avatar de usuario
simonc

Sí, todos los miembros de a se garantiza que se inicializarán a 0.

Del apartado 3.5.7 de la norma C89

Si un objeto que tiene una duración de almacenamiento estático no se inicializa explícitamente, se inicializa implícitamente como si a cada miembro que tiene un tipo aritmético se le asignara 0 y a cada miembro que tiene un tipo de puntero se le asignara una constante de puntero nulo.

  • ¿Creo que esto es del borrador ANSI C “X3”? El mismo texto aún se mantiene en el estándar C, pero ¿por qué citar una fuente tan antigua y obsoleta?

    – Lundin

    15 de abril de 2013 a las 13:24

  • @Lundin Era la única fuente que tenía a mano y pensé que aún era una mejor respuesta que “Sí, el estándar (sin referencia) lo dice”. Hice +1 en su referencia a un estándar más moderno.

    – simón

    15/04/2013 a las 13:25

  • Ajá, bueno el Borrador C11 es bastante fácil de encontrar en la red. Las diferencias entre el borrador y el estándar C11 final son cosméticas, aparte de un corrigendum menor.

    – Lundin

    15 de abril de 2013 a las 13:28


  • Un cambio entre el estándar C de 1989 y el estándar actual es que un objeto no inicializado con duración de almacenamiento automático no no tienen valor indeterminado. Generalmente, el estándar no define el comportamiento resultante del uso de tal objeto.

    –Eric Postpischil

    15 de abril de 2013 a las 13:43

  • La mejor referencia sería la el más antiguo disponible, porque mostraría el historial de cuánto tiempo ha estado vigente la regla. Si proporciona una referencia al estándar C18, podría suponer (incorrectamente) que se trata de una nueva parte del estándar. Saber que el código C escrito en 1975 tendrá sus variables globales no inicializadas puestas a cero es importante. Agradecería una referencia a la estándar más antiguo que establece esta regla.

    – Christopher Schultz

    18/01/2019 a las 17:00

Las “variables globales” se definen en alcance del archivo, fuera de cualquier función. Todas las variables que se definen en el ámbito del archivo y todas las variables que se declaran con la palabra clave static tener algo llamado duración del almacenamiento estático. Esto significa que se asignarán en una parte separada de la memoria y existirán durante toda la vida útil del programa.

También significa que se garantiza que se inicializarán a cero en cualquier compilador de C.

Del estándar C actual C11 6.7.9/10:

“… Si un objeto que tiene una duración de almacenamiento estático o de subprocesos no se inicializa explícitamente, entonces:

— si tiene un tipo de puntero, se inicializa a un puntero nulo;

— si es de tipo aritmético, se inicializa a cero (positivo o sin signo);”

En la práctica, esto significa que si inicializa su variable global a un valor dado, tendrá ese valor y se ubicará en un segmento de memoria generalmente denominado .data. Si no le da un valor, se asignará en otro segmento llamado .bss. Los globales nunca se asignarán en la pila.

avatar de usuario
Sam

Si. Cualquier variable global se inicializa en el valor por defecto de ese tipo
0 es el valor predeterminado y se convierte automáticamente en cualquier tipo. Si es un puntero, 0 se convierte NULL

Las variables globales consiguen espacio en el segmento de datos que se pone a cero.

Está no específico del compilador pero definido en el estándar C.

Entonces siempre imprimirá 0.

  • XORing consigo mismo es un detalle de implementación; No importa cómo el material se pone a cero.

    – glglgl

    15 de abril de 2013 a las 13:12

  • Además, dudo mucho que cualquier implementación moderna use XOR para vaciar la memoria, ya que incurriría en operaciones de lectura adicionales, lo cual es completamente innecesario y aumenta el tiempo de inicio de la aplicación. XOR en sí mismo funciona bien para borrar registros en ciertos procesadores que no tienen una instrucción especial para “establecer registro en cero”. No es bueno para establecer regiones de memoria a cero.

    – Mats Peterson

    15 de abril de 2013 a las 13:14


Los objetos de ámbito de archivo declarados sin inicializadores explícitos son inicializados por 0 por defecto (y para NULL para punteros).

Los objetos no estáticos en el alcance del bloque declarados sin inicializadores explícitos se dejan sin inicializar.

¿La variable global siempre se inicializa a cero en C?

Sí y está definido en el estándar C.

avatar de usuario
Prasoon Saurav

No es específico del compilador. El código siempre se imprimirá 0.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad