Maison > développement back-end > C++ > Pourquoi « cout » n'affiche-t-il pas correctement l'adresse d'une variable membre « char » ?

Pourquoi « cout » n'affiche-t-il pas correctement l'adresse d'une variable membre « char » ?

Barbara Streisand
Libérer: 2025-01-03 14:36:39
original
382 Les gens l'ont consulté

Why Doesn't `cout` Display the Address of a `char` Member Variable Correctly?

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

Considérez l'extrait de code suivant :

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

void Address :: showMap ( void ) {
            cout << "address of int    :" << &i << endl ;
            cout << "address of char   :" << &b << endl ;
            cout << "address of string :" << &c << endl ;
}
Copier après la connexion

Il est prévu que la sortie devrait afficher les adresses des variables membres int, char et string. Cependant, l'adresse de la variable char b reste vide.

Raison

Cette bizarrerie survient parce que le << L'opérateur interprète &b comme une chaîne de style C plutôt que comme une adresse. Les pointeurs de caractères sont interprétés comme des séquences de caractères terminées par un caractère nul par l'attribut << opérateur.

Solution

Pour résoudre ce problème et afficher l'adresse de la variable char, vous pouvez utiliser le code modifié suivant :

cout << "address of char   :" << (void *) &b << endl;
Copier après la connexion

Ici, nous utilisons un Casting de style C pour convertir explicitement &b en void *. Ceci indique au << opérateur pour le traiter comme une adresse plutôt que comme une séquence de caractères. Une alternative plus sûre consiste à utiliser static_cast :

cout << "address of char   :" << static_cast<void *>(&b) << endl;
Copier après la connexion

Une autre observation intéressante

Lorsque les variables membres int, char et string sont déclarées publiques, la sortie change légèrement :

  ... int    :  something 
  ... char   :   
  ... string :  something_2
Copier après la connexion

Ici, quelque chose_2 est toujours 8 de moins que quelque chose.

Cette différence se produit parce que le compilateur complète le membre public variables pour les aligner de manière optimale pour l’accès à la mémoire. Dans ce cas, la variable char est probablement complétée à 8 octets, ce qui entraîne une différence d'adresses de 8 octets entre les variables int et string.

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