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?

44
demandé sur Community 2012-12-27 09:29:50

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.

95
répondu K-ballo 2012-12-27 05:37:54
Les variables

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.

La mémoire

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.

36
répondu Raghu Srikanth Reddy 2016-01-30 18:03:48

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.

13
répondu Jonathan Leffler 2016-10-14 05:42:47
Les variables globales

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.

7
répondu WiSaGaN 2012-12-27 05:36:32