2009-06-17 13 views
4

Lorsqu'un programme C démarre et que des variables sont affectées à des emplacements de mémoire, le standard C indique-t-il si cette valeur est initialisée?Quel est l'état par défaut des variables?

// global variables 
int a; 
int b = 0; 
static int c; 

Dans le code ci-dessus, « b » sera initialisé à 0. Quelle est la valeur initiale de « a »? Est-ce que 'c' est différent puisqu'il est statique pour ce module?

Répondre

11

Puisque vous mentionnez spécifiquement Variables globales: Dans le cas des variables globales, si elles sont déclarées static ou non, ils seront initialisées à 0.

variables locales d'autre part sera undefined (à moins qu'ils ne soient déclarés static, auquel cas ils seront également initialisés à 0 - merci Tyler McHenry). Traduit, cela signifie que vous ne pouvez pas compter sur eux contenant une chose particulière - ils ne contiennent que la poubelle aléatoire était déjà en mémoire à cet endroit, ce qui pourrait être différent d'exécuter à exécuter.

+2

Notez que les variables locales statiques sont également initialisées à zéro. –

5

Edit:ce qui suit uniquement aux variables locales - non GLOBALS.

La valeur initiale d'une variable est indéfinie. Dans certaines langues, l'emplacement d'une variable dans la mémoire est mis à zéro lors de la déclaration, mais en C (et C++), une variable non initialisée contiendra tout ce qui se trouve à cet emplacement à ce moment-là.

Donc, la meilleure façon de penser est qu'une variable non initialisée plus susceptibles de contenir des ordures et ont un comportement non défini.

+1

Cela n'est vrai que pour les variables locales de durée automatique. –

+0

-1, c'est faux dans le contexte des variables globales. Ping-moi si le poste est changé, alors je vais supprimer le downvote. –

+0

Yikes! Je n'ai pas remarqué le commentaire "// variables globales". Je vais modifier pour refléter cela. –

0

Un test rapide montre a et c soit 0.

int a; 
static int c; 
int main() { 
    printf("%d %d\n", a, c); 
    return 0; 
} 

L'emplacement d'un (c) sont déterminés au moment de la compilation; c'est-à-dire qu'ils ne sont ni mis dans la pile ni dans un intervalle de mémoire renvoyé par malloc. Je pense que la norme C dit qu'ils sont initialisés à 0 dans tous les cas, alors.

Je suis à 99,9% confiance en ce qui concerne c, et 98% confiant en ce qui concerne a. Le mot-clé static, dans le contexte des variables globales, est vraiment analogue à private en (disons) C++ et Java: il s'agit de visibilité, pas de lieu de stockage.

Qu'est-ce que Andrew Hare dit sur les variables non initialisées est vrai pour les données stockées sur la pile ou dans la mémoire malloc'd. Pas pour les variables statiquement stockées.

+1

Vous avez raison de dire que le standard du langage C garantit ce comportement, mais votre "test" ne vérifie pas vraiment ce que j'ai peur - imaginez si C n'a pas mis les globales à 0, mais il est juste arrivé que lorsque vous avez couru votre programme, les valeurs en mémoire où a et c vivent déjà 0. –

+1

en mode débogage, les débogueurs modernes remplissent la mémoire avec un certain modèle binaire, donc si vous n'avez pas initialisé une variable, vous le savez immédiatement. par exemple, Visual Studio le fait de cette façon. – codymanix

+0

@codymanix: Bon point. (Minor nit: Je crois que (pour MSVC++ au moins) un .EXE compilé par débogage initialise la mémoire avec ce modèle binaire lui-même, c'est-à-dire indépendamment du fait qu'un débogueur externe soit en cours d'exécution.) –

4

a sera 0, et c aussi, s'ils sont globaux et non initialisés explicitement. Ceci est également vrai pour les variables statiques locales.

Seules les variables non statiques locales ne sont pas initialisés. De plus, la mémoire allouée avec malloc n'est pas initialisée.

Voir here des règles de répartition et initialisations en C pour les différents objets.

+0

+1 lien vers d'autres choses – Tom

1

Je tape beaucoup trop lentement ce matin. Trois personnes sont intervenues rapidement alors que je répondais, alors j'ai supprimé la plupart de mes messages.Le lien que j'ai trouvé était clair et bref, donc je publie de toute façon: Wikipedia on "uninitialized variable" pour une discussion sur les problèmes de base.

Questions connexes