Maison > développement back-end > C++ > Comment une variable à la même adresse mémoire peut-elle avoir deux valeurs différentes en C ?

Comment une variable à la même adresse mémoire peut-elle avoir deux valeurs différentes en C ?

Patricia Arquette
Libérer: 2024-11-29 00:37:11
original
193 Les gens l'ont consulté

How Can a Variable at the Same Memory Address Have Two Different Values in C  ?

Dévoiler l'énigme des incohérences d'adresses de variables : une plongée dans un comportement indéfini

Dans le domaine déroutant des variables, une question particulière se pose : comment est-il possible qu'une variable à la même adresse donne deux valeurs distinctes ? Pour percer ce mystère, examinons un extrait de code qui démontre ce comportement inhabituel.

Considérez le code C suivant :

#include <iostream>
using namespace std;

int main(void) {
    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;

    return 0;
}
Copier après la connexion

Étonnamment, la sortie de ce code révèle une incohérence :

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

La variable 'a1', qui est déclarée comme const, conserve sa valeur d'origine de 40. Cependant, « t », un pointeur pointant vers le même emplacement mémoire que « b1 », présente une valeur de 65 (« A » en ASCII). Comment est-ce possible ?

La réponse réside dans la notion de comportement indéfini. Dans ce cas, la modification d'une variable const (« a1 » dans ce cas) déclenche un comportement non défini, selon la norme C (7.1.6.1). En conséquence, les résultats deviennent imprévisibles et peuvent varier selon les différents compilateurs ou même selon les différentes exécutions du même code.

Le standard C indique clairement que « toute tentative de modification d'un objet const au cours de sa durée de vie entraîne un comportement indéfini. ". En d'autres termes, le comportement de telles modifications n'est pas défini par le langage, ce qui le laisse ouvert à des résultats arbitraires.

Dans cet exemple spécifique, la modification du caractère pointé par 'c1' (qui est le même emplacement mémoire comme « a1 ») entraîne une modification inattendue de la valeur récupérée via « t ». En effet, les conversions de type entre 'char' et 'int' redéfinissent efficacement l'interprétation des données stockées dans cet emplacement mémoire.

Il est important de noter qu'un comportement indéfini peut se manifester de diverses manières. différentes manières, notamment en ignorant complètement la situation, en produisant un message de diagnostic ou en mettant fin au programme. Par conséquent, il est crucial d'éviter d'invoquer un comportement non défini dans le code de production pour garantir une exécution prévisible et fiable du programme.

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