6
votes

Quelle sera la valeur de la variable non initialisée?

Dupliqué possible:
est un comportement de données ininitialisé bien spécifié?

J'ai essayé le code suivant xxx

Le résultat a donné une valeur déductrice en VC ++, tandis que la même chose en TC était nulle. Quelle sera la valeur correcte? Une variable non initialisée sera-t-elle par défaut ayant une valeur de zéro? ou contiendra la valeur des ordures?

suivant est sur le même xxx

Quelle sera la sortie du code ci-dessus?


6 commentaires

Il est indéfini. C'est pourquoi c'est des ordures. Dans C, tu dois initialiser les choses vous-même.


Quelle langue? C ou c? Oh, attendez...


La sortie Votre code m'a donné: i48.servimg.com /u/f48/11/68/36/17/nasal_10.png : -O


Voter pour rouvrir. Le duplicaté lié est une question C ++, et C et C ++ sont des langues différentes qui ont des règles différentes entourant des variables non initialisées.


Le lien vers la FAQ de STROSTRUP a changé en STROUSTRUPOW.BS_FAQ2.HTMLFOVOID-MAIN < / a>.


Main () renvoie int et prend les arguments int argc et Char ** argv .


6 Réponses :


2
votes

C'est indéterminé. Le compilateur peut faire ce qu'il veut.


1 commentaires

Être pédant; sa valeur est indéterminée; L'utilisation de cela donne des comportements non définis.




10
votes

Techniquement, la valeur d'une variable locale non statique non initialisée est indéterminée [réf 1] .
En bref, cela peut être n'importe quoi. L'accès à une telle variable non initialisée conduit à un comportement indéfini . [ref 2]

[réf 1]
C99 Section 6.7.8 Initialisation:

Si un objet qui a une durée de stockage automatique n'est pas initialisé explicitement, sa valeur est indéterminée.

[ref 2]

C99 Section 3.18 Comportement non limité:

comportement, lors de l'utilisation de une construction de programme non-sport ou erronée, de données erronées ou de d'objets indéterminés indéterminés , pour lesquels cette norme internationale n'impose aucune exigence.

Remarque: mettez l'accent sur la mine.


6 commentaires

OP demande à propos de C (C89?), Pas C ++ 03.


@ Keelerjr12: Il a été redirigé ultérieurement.Modified pour C99.


Pourquoi répondez-vous à une telle dupe évidente? Je pensais mieux de toi.


@sbi: J'ai toujours connu les deux premières déclarations de ma réponse.Je ne saviez pas vraiment quelle partie de la norme C explicitement dit ( Je sais précisément où les états standard de C ++ sont si ). je était désireux de trouver le détail pour C standard ( oui, je ne suis pas bien versé en C ). Si vous voyez mes modifications de réponse, j'ai pris beaucoup de temps pour trouver les détails exacts où les états standard C Ceci.Je édité au détail après que ce q a été fermé.Il était plus d'apprendre une expérience moi-même plutôt que de simplement fournir une réponse. Et j'admets que je suis assez égoïste pour vouloir apprendre des choses plutôt que de donner des réponses.


@Als: Pourquoi répondez-vous à une telle dupe évidente? Je pensais mieux de toi.


Ceci est le plus imprécis et la référence 2 n'est pas pertinente - vous ne citez pas la partie de la norme qui étiquette cette UB. Parce qu'il n'y a même aucune source évidente dans la norme en disant ainsi. Voir Stackoverflow.com/a/40674888/584518



1
votes

la valeur est indéterminée; L'utilisation de la variable avant l'initialisation entraîne un comportement indéfini.


0 commentaires

-1
votes

C'est indéfini . Il peut être différent entre différents compilateurs, différents systèmes d'exploitation, des courses différentes du programme, n'importe quoi. Il pourrait même pas être une valeur particulière: le compilateur est autorisé à faire tout ce qu'il aime ce code, car l'effet n'est pas défini. Il pourrait choisir d'optimiser votre programme entier. Il pourrait même choisir de remplacer votre programme avec celui des installateurs un Keylogger et vole tous vos détails de connexion bancaire en ligne.

Si vous voulez connaître la valeur, le seul moyen est de le définir.


0 commentaires

-1
votes

Comme d'autres l'ont noté, la valeur peut être quelque chose.

Cela conduit parfois à des bugs difficiles à trouver, par ex. Parce que vous arrive pour obtenir une valeur dans une version de débogage et obtenir une valeur différente dans une version de version, ou la valeur initiale que vous obtenez dépend de l'exécution précédente du programme.

Leçon: toujours initialiser les variables. Il y a une raison que c # définit des valeurs pour les champs et nécessite une initialisation des variables locales.


0 commentaires