Maison > développement back-end > C++ > Pourquoi la modification d'une variable « const » via un pointeur d'un type différent entraîne-t-elle un comportement non défini en C ?

Pourquoi la modification d'une variable « const » via un pointeur d'un type différent entraîne-t-elle un comportement non défini en C ?

Susan Sarandon
Libérer: 2024-12-08 16:21:10
original
502 Les gens l'ont consulté

Why Does Modifying a `const` Variable Through a Pointer of a Different Type Lead to Undefined Behavior in C  ?

Valeur changeante de variable à la même adresse : comprendre le comportement non défini

En C, les variables avec différents types de données peuvent occuper la même adresse mémoire, conduisant à des résultats inattendus. Considérez le code suivant :

const int a1 = 40;
const int* b1 = &a1;
char* c1 = (char *)(b1);
*c1 = 'A';
int *t = (int*)c1;

cout << a1 << " " << *t << endl;
cout << &a1 << " " << t << endl;
Copier après la connexion

Après avoir exécuté ce code, vous pouvez vous attendre à ce que a1 et *t aient la valeur 40, et que &a1 et t aient la même adresse. Cependant, le résultat est surprenant :

40 65 
0xbfacbe8c 0xbfacbe8c
Copier après la connexion

Comment est-il possible qu'une variable à la même adresse produise deux valeurs différentes ?

Explication

Ce comportement se produit en raison d'un comportement non défini dans le code. Plus précisément, modifier une variable const comme a1 est un comportement indéfini. Le standard C (section 7.1.6.1) stipule explicitement que toute tentative de modification d'un objet const au cours de sa durée de vie entraîne un comportement indéfini.

Dans ce cas, en modifiant *c1 (qui pointe vers a1), on a modifié efficacement une variable const. C'est pourquoi le compilateur est incapable de garantir le comportement attendu et produit à la place des résultats imprévisibles.

Les comportements possibles dans de tels cas sont spécifiés dans la section 1.3.24 de la norme. Celles-ci vont de l'ignorance complète de la situation à la fin du programme avec un message d'erreur. Dans ce cas, le compilateur a choisi de produire des valeurs différentes pour a1 et *t.

Conclusion

Un comportement non défini doit être évité dans le code C, car il peut conduire à des résultats inattendus et incohérents. Dans ce scénario spécifique, accéder à une variable const via un pointeur d'un type différent et la modifier a entraîné un comportement indéfini et une sortie imprévisible.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal