Duplicate possible:
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 %d\n", a, i);
}
Sortie
0 8683508
Ici, 'a' est initialisé avec '0', mais 'i' avec une 'valeur indésirable'. Pourquoi?
Parce que c'est comme ça, selon le C Standard. La raison en est l'efficacité:
statique les variables sont initialisées à heure de compilation, car leur adresse est connue et fixée. Initialisation à 0
ne comporte pas de coût d’exécution.
automatique les variables peuvent avoir des adresses différentes pour différents appels et doivent être initialisées à exécution à chaque appel de la fonction, ce qui entraîne un coût d'exécution inutile. Si vous avez besoin de cette initialisation, demandez-la.
Les variables global
et static
sont stockées dans le segment de données (DS) une fois initialisées et le début du bloc par un symbole (BSS) `non initialisées.
Ces variables ont un emplacement mémoire fixe et la mémoire est allouée au moment de la compilation.
Ainsi, les variables global
et static
ont '0'
comme valeurs par défaut.
Alors que auto
les variables sont stockées dans la pile et qu’elles n’ont pas d’emplacement mémoire fixe.
La mémoire est allouée aux variables auto
au moment de l'exécution, mais pas au moment de la compilation. Ainsi, les variables auto
ont leur valeur par défaut garbage.
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 initialisait les tableaux sur 0, l'effort serait gaspillé. l'initialisation est écrasée par le reste de la fonction. C évite les coûts cachés autant que possible.
Les variables globales sont allouées et initialisées avant le démarrage de la fonction main
, tandis que les variables locales sont générées sur la pile lors de l'exécution de l'instance du programme.