una - ¿Por qué las variables globales siempre se inicializan a ''0'', pero no a las variables locales?
variables globales y locales en visual basic (4)
Posible duplicado:
¿Por qué las variables globales y estáticas se inicializan a sus valores predeterminados?
Ver el código,
#include <stdio.h>
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é?
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 resto 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 pila a medida que se ejecuta la instancia del programa.
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 compilació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 compilación.
Por lo tanto, global
variables global
y static
tienen ''0''
como sus valores predeterminados.
Mientras que auto
variables auto
se almacenan en la pila, 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 compilación. Por lo tanto, auto
variables auto
tienen su valor predeterminado como basura.