Comment une variable non initiée obtient-elle une valeur de déchets?

Lorsque nous créons une variable sans l’initialiser, un nombre (aléatoire) appelé garbage value lui est atsortingbué.

  • Comment cette valeur est assignée à la variable?
  • Quel est le concept / mécanisme entier derrière cela?
  • Est-ce que cela se produit uniquement en C?

La valeur de garbage n’est pas assignée , mais la valeur est déjà là. Lorsque vous allouez une variable, vous réservez une partie de la mémoire. Jusqu’à ce que vous l’écrasiez, cette mémoire contiendra toutes les informations “aléatoires” qui existaient auparavant.

En tant que métaphore, pensez à atsortingbuer une variable comme acheter un terrain – jusqu’à ce que vous en fassiez quelque chose (comme construire une maison), le terrain ne contiendra plus que les déchets qui s’y trouvaient déjà (comme une vieille maison en ruine).

Certaines langues rempliront automatiquement les variables nouvellement allouées avec des zéros – cela prend du temps. Dans les langages plus “à faire soi-même” comme C, ce comportement supplémentaire n’est pas garanti (même si sur certains systèmes, la mémoire est effacée quelle que soit la langue, par exemple par mesure de sécurité).

La mémoire est utilisée et réutilisée à différents moments de votre application. Par exemple, au fur et à mesure que la stack d’appels de votre application s’agrandit et diminue, le même emplacement en mémoire peut être écrasé de nombreuses fois. Il est important de rappeler que lorsqu’un morceau de mémoire est abandonné, il n’est pas mis à zéro. Par conséquent, si vous ne spécifiez pas de nouvelle valeur initiale pour cet emplacement en mémoire lorsque vous l’utilisez à nouveau, vous obtiendrez l’ancienne valeur “garbage”.

Certaines langues et implémentations de structures initialisent par défaut la mémoire utilisée. D’autres non, il est donc important de lire attentivement la documentation de votre langue pour savoir à quoi vous attendre.

Personne n’atsortingbue explicitement une valeur de grabage. Si vous créez une variable, seul son emplacement est déterminé, et non sa valeur. C’est pourquoi nous l’initialisons. La valeur de garbage peut provenir d’opérations précédentes effectuées sur la même mémoire par d’anciens processus! Donc, il peut contenir n’importe quoi. Je pense que cela tient à assez bon nombre de langues. Je ne suis pas sûr de la liste! 🙂

Lorsque nous créons une variable sans l’initialiser, rien ne se passe. Lorsque vous lisez la valeur de cette variable, vous obtenez des données de la mémoire où la variable se trouve maintenant. Cela pourrait ressembler à une valeur aléatoire / aléatoire uniquement parce que les variables sont placées en mémoire avec un certain degré d’aléatoire.

Les normes C disent:

  • Comportement non défini pour les variables locales: (Pourquoi) utilise-t-il un comportement non défini de variable non initialisée? (par exemple, segfault est légal)
  • zéro pour les variables globales: qu’advient-il d’une variable déclarée non initialisée en C? At-il une valeur?

Mise en œuvre: examen détaillé d’une mise en œuvre à l’ adresse : https://stackoverflow.com/a/36725211/895245 Résumé:

  • local: l’adresse n’est jamais écrite, donc tout ce qui s’y trouvait a déjà été utilisé
  • global: .bss