¿Por qué las variables globales siempre se inicializan a ‘0’, pero no a las variables locales?

Posible duplicado:
¿Por qué las variables globales y estáticas se inicializan a sus valores predeterminados?

Ver el código,

#include  int a; int main(void) { int i; printf("%d %d\n", a, i); } 

Salida

 0 8683508 

Aquí ‘a’ se inicializa con ‘0’, pero ‘i’ se inicializa con ‘valor basura’. ¿Por qué?

Porque así son las cosas, de acuerdo con el estándar C. La razón de eso es la eficiencia:

  • las variables estáticas se inicializan en tiempo de comstackción , ya que su dirección es conocida y está fija. Inicializarlos en 0 no implica un costo de tiempo de ejecución.

  • las variables automáticas pueden tener diferentes direcciones para diferentes llamadas y deberían inicializarse en tiempo de ejecución cada vez que se llame a la función, incurriendo en un costo en tiempo de ejecución que puede no ser necesario. Si necesita esa inicialización, solicítela.

global variables global y static se almacenan en el segmento de datos (DS) cuando se inicializan y bloquean el inicio por el símbolo (BSS) `cuando no se inicializan.

Estas variables tienen una ubicación de memoria fija, y la memoria se asigna en tiempo de comstackción.

Por lo tanto, global variables global y static tienen '0' como sus valores predeterminados.

Mientras que auto variables auto se almacenan en la stack, y no tienen una ubicación de memoria fija.

La memoria se asigna a variables auto en tiempo de ejecución, pero no en tiempo de comstackción. Por lo tanto, auto variables auto tienen su valor predeterminado como basura.

Has elegido variables simples, pero considera:

 void matrix_manipulation(void) { int matrix1[100][100]; int matrix2[100][100]; int matrix3[100][100]; /* code to read values for matrix1 from a file */ /* code to read values for matrix2 from a file */ /* code to multiply matrix1 by matrix2 storing the result in matrix3 */ /* code to use matrix3 somehow */ } 

Si el sistema inicializó las matrices en 0, el esfuerzo se desperdiciaría; la inicialización es sobrescrita por el rest de la función. C evita los costos ocultos siempre que sea posible.

Las variables globales se asignan e inicializan antes de que comience la función main , mientras que las variables locales se generan en la stack a medida que se ejecuta la instancia del progtwig.