Dupliqué possible: strong>
est un comportement de données ininitialisé bien spécifié? P>J'ai essayé le code suivant p>
xxx pré> 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? p>
suivant est sur le même p>
xxx pré> Quelle sera la sortie du code ci-dessus? p> BlockQuote>
6 Réponses :
C'est indéterminé. Le compilateur peut faire ce qu'il veut. P>
Être pédant; sa valeur est indéterminée; L'utilisation de cela donne des comportements non définis.
Accéder à une variable unialisée est un comportement non défini en C et C ++, de sorte que la lecture soit possible. P>
Il est également possible que votre programme se bloque: une fois que vous êtes dans un territoire de comportement indéfini, tous les paris sont désactivés 1 sup>. P>
1 sup> Je n'ai jamais vu de programme s'écraser sur l'accès à une variable non antimisée, à moins que ce soit un pointeur. P>
Pour les implémentations comprenant des représentations de pièges, la lecture d'un objet non assemblé de tout type autre que le caractère non signé (y compris INT) peut déclencher un piège.
Citation requise. Ceci est surtout incorrect. Les systèmes avec des représentations de piège sont principalement fictifs et ne doivent pas être pris en compte pour la grande majorité des programmes. Dans de nombreux cas, l'accès à une variable ininitialisée ne pas i> invoque UB. Stackoverflow.com/ Questions / 11962457 / ...
Techniquement, la valeur d'une variable locale non statique non initialisée est [réf 1] sup> Si un objet qui a une durée de stockage automatique n'est pas initialisé explicitement, sa valeur est indéterminée. P>
blockQuote>
[ref 2] sup> p>
C99 Section 3.18 Comportement non limité: strong> p>
comportement, lors de l'utilisation de strong> une construction de programme non-sport ou erronée, de données erronées ou de Remarque: mettez l'accent sur la mine. P>
En bref, cela peut être n'importe quoi. L'accès à une telle variable non initialisée conduit à un comportement
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 i>). je était désireux de trouver le détail pour C standard ( oui, je ne suis pas bien versé en C i>). 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
la valeur est indéterminée; L'utilisation de la variable avant l'initialisation entraîne un comportement indéfini. P>
C'est indéfini em>. 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. P>
Si vous voulez connaître la valeur, le seul moyen est de le définir. P>
Comme d'autres l'ont noté, la valeur peut em> être quelque chose. P>
Cela conduit parfois à des bugs difficiles à trouver, par ex. Parce que vous arrive em> 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. P>
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. P>
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 () Code> renvoie
int code> et prend les arguments
int argc code> et
Char ** argv code>.