web-dev-qa-db-fra.com

Pourquoi les variables globales sont-elles toujours initialisées à '0', mais pas les variables locales?

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?

51
yuvanesh

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.

109
K-ballo

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.

41

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.

15
Jonathan Leffler

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.

7
WiSaGaN