Initialisation automatique des variables locales

J’ai l’extrait de code suivant.

int j; printf("%d",j); 

Comme prévu, je reçois une valeur de déchets.

32039491

Mais quand j’inclus une boucle dans l’extrait ci-dessus, comme

 int j; print("%d",j); while(j); 

Je reçois le résultat suivant sur plusieurs essais du programme.

0

J’ai toujours pensé que les variables locales sont initialisées à une valeur erronée par défaut, mais il semble que les variables soient auto-initialisées lorsqu’une boucle est utilisée.

C’est avoir une valeur indéterminée . Cela peut être n’importe quoi.

Citant C11 §6.7.9

Si un object ayant une durée de stockage automatique n’est pas initialisé explicitement, sa valeur est indéterminée. […]

Les variables locales automatiques, sauf initialisation explicite, contiendront une valeur indéterminée. Si vous essayez d’utiliser une variable alors qu’elle contient une valeur indéterminée et que

  • n’a pas l’adresse prise
  • peut avoir une représentation piège

l’utilisation conduira à un comportement indéfini .

Comme prévu, je reçois une valeur de déchets.

Ensuite, vos attentes sont inespérées. Lorsque vous utilisez la valeur indéterminée d’un object non initialisé, vous obtenez généralement (et pour vos extraits de code uniquement, un comportement indéfini ). Imprimer une valeur de mémoire n’est qu’une infinité de manifestations possibles.

J’ai toujours pensé que les variables locales sont initialisées à une valeur erronée par défaut, mais il semble que les variables soient auto-initialisées lorsqu’une boucle est utilisée.

Vous pensiez mal et vous tiriez également la mauvaise conclusion. Les deux extraits de code, quand ils sont seuls, présentent un comportement indéfini. Vous ne pouvez pas compter en toute sécurité sur un résultat particulier.