Maison >développement back-end >C++ >Pourquoi l'adresse d'une variable Char ne s'affiche-t-elle pas correctement en C ?

Pourquoi l'adresse d'une variable Char ne s'affiche-t-elle pas correctement en C ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-03 19:02:43838parcourir

Why Doesn't the Address of a Char Variable Display Correctly in C  ?

Pourquoi l'adresse des données de caractère n'est-elle pas affichée ?

Considérez ce code :

class Address {
public:
    int i;
    char b;
    string c;
    
    void showMap();
};

void Address::showMap() {
    cout << "address of int    : " << &i << endl;
    cout << "address of char   : " << &b << endl;
    cout << "address of string : " << &c << endl;
}

Lors de l'exécution de ce code , vous remarquerez peut-être que l'adresse de la variable char 'b' n'est pas affichée dans la sortie. Au lieu de cela, vous voyez une zone vide. Pourquoi cela se produit-il ?

La raison réside dans la façon dont l'opérateur d'adresse (&) fonctionne avec différents types de données. Lorsqu'il est appliqué à une variable char, &b, vous obtenez un pointeur char, c'est-à-dire char *.

Par défaut, l'opérateur de sortie << interprète ce char* comme une chaîne de style C et tente d'imprimer une séquence de caractères. Cependant, dans ce cas, nous souhaitons uniquement afficher l'adresse de la variable char, pas sa valeur.

Pour résoudre ce problème, vous pouvez utiliser l'approche suivante :

cout << "address of char   : " << (void *) &b << endl;

Ici , nous convertissons l'adresse de b en void * avant de l'utiliser avec l'opérateur de sortie. Cela garantit que l'opérateur le traite comme un pointeur vers un emplacement mémoire, et non comme une séquence de caractères.

Pourquoi la différence entre les adresses est-elle 8 ?

Si vous effectuez la variables membres 'int', 'char' et 'string' publiques, vous pouvez observer un autre comportement intéressant. La différence entre les adresses de 'int' et 'string' est systématiquement de 8. En effet :

  • L'alignement par défaut pour int sur la plupart des architectures est de 4 octets.
  • La valeur par défaut l'alignement pour le caractère est de 1 octet.
  • L'alignement par défaut pour la chaîne est de 4 octets.

Quand le compilateur alloue de la mémoire aux membres de la classe, il le fait d'une manière qui les aligne sur leurs limites respectives. Dans ce cas, la variable char 'b' occupe un seul octet, laissant 3 octets d'espace inutilisé. Cet espace est ensuite suivi de la variable chaîne 'c', qui s'aligne sur la limite de 4 octets la plus proche.

En conséquence, la différence entre les adresses de '&c' et '&b' sera de 1 ( pour 'b') 3 (pour l'espace inutilisé) 4 (pour l'alignement sur 4 octets de 'c') = 8.

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!

Déclaration:
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