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;
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
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!