Question

Quand un programme C démarre et que des variables sont affectées à des emplacements mémoire, le standard C indique-t-il si cette valeur est initialisée?

// 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"? 'C' est-il différent puisqu'il est statique pour ce module?

Était-ce utile?

La solution

Puisque vous mentionnez spécifiquement les variables globales : dans le cas de variables globales, qu'elles soient déclarées static ou non, elles seront initialisées à 0.

Les variables

locales seront quant à elles indéfinies (sauf si elles sont déclarées static , auquel cas elles seront également initialisées à 0 - merci Tyler McHenry). Traduit, cela signifie que vous ne pouvez pas compter sur eux contenant quelque chose en particulier - ils ne contiendront que les déchets aléatoires déjà en mémoire à cet emplacement, ce qui pourrait être différent d'une exécution à l'autre.

Autres conseils

  

Modifier: Les éléments suivants s'appliquent uniquement aux variables locales, et non aux variables globales.

La valeur initiale d'une variable est indéfinie. Dans certaines langues, l'emplacement d'une variable en mémoire est défini sur zéro lors de la déclaration, mais en C (et C ++ également), une variable non initialisée contiendra toutes les ordures résidant à cet emplacement à ce moment-là.

La meilleure façon de penser à cela est donc qu'une variable non initialisée contiendra très probablement des ordures et aura un comportement indéfini.

a sera égal à zéro et c également, s’ils sont globaux et non explicitement initialisés. Ceci est également vrai pour les variables statiques locales.

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

Voir ici pour les règles d'initialisation et d'allocation en C des différents objets.

Je tape trop lentement ce matin. Trois personnes sont arrivées rapidement alors que je répondais. J'ai donc supprimé la plupart de mes messages. Le lien que j’ai trouvé était clair et bref, et je le poste de toute façon: Wikipedia sur la variable non initialisée. pour une discussion sur les problèmes de base.

Un test rapide montre que a et c sont égaux à 0.

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

Les emplacements de a (et c) sont déterminés lors de la compilation; c'est-à-dire qu'ils ne sont ni mis sur la pile ni dans un intervalle de mémoire renvoyé par malloc. Je pense que le standard C dit qu'ils sont initialisés à 0 dans tous les cas, alors.

Je suis à 99,9% confiant en ce qui concerne c et 98% 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 la visibilité, pas de l'emplacement de stockage.

Ce que dit Andrew Hare à propos des variables non initialisées est vrai pour les données stockées sur la pile ou dans la mémoire malloc'd. Ce n’est pas le cas pour les variables stockées de manière statique.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top