Pourquoi sont des variables globales toujours initialisé à 0, mais pas les variables locales? [dupliquer]
possible Duplicate:
pourquoi les variables globales et statiques sont-elles initialisées à leurs valeurs par défaut?
voir le code,
#include <stdio.h>
int a;
int main(void)
{
int i;
printf("%d %dn", a, i);
}
Sortie
0 8683508
Ici " a " est initialisé avec '0', mais 'je' est initialisé avec une 'valeur indésirable'. Pourquoi?
4 réponses
parce que c'est ainsi, selon la norme C . La raison en est l'efficacité:
-
les variables statiques sont initialisées à temps de compilation , puisque leur adresse est connue et fixée. Les initialiser à
0
n'entraîne pas de coût d'exécution. -
variables" automatiques variables can avoir des adresses différentes pour des appels différents et devrait être initialisé à runtime chaque fois que la fonction est appelée, entraînant un coût d'exécution qui peut ne pas être nécessaire. Si vous avez besoin de cette initialisation, demandez-la.
global
et static
sont stockées dans le Segment de données (DS) lorsqu'elles sont initialisées et le bloc commence par le symbole (BSS)` lorsqu'il n'est pas initialisé.
ces variables ont un emplacement de mémoire fixe, et la mémoire est attribuée au moment de la compilation.
ainsi global
et static
variables ont '0'
comme valeurs par défaut.
alors que auto
variables sont stockées sur la pile, et ils ne avoir un emplacement mémoire fixe.
est attribuée aux variables auto
à l'exécution, mais pas à
moment de la compilation. Par conséquent, les variables auto
ont leur valeur par défaut comme valeur poubelle.
vous avez choisi des variables simples, mais considérez:
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 le système initialise les tableaux à 0, l'effort sera gaspillé; l'initialisation est écrasée par le reste de la fonction. C évite les coûts cachés dans la mesure du possible.
sont attribuées et initialisées avant le début de la fonction main
, tandis que les variables locales sont générées sur la pile lorsque l'instance du programme tourne.