Maison > développement back-end > C++ > Pourquoi l'impression de l'adresse d'un membre char dans une classe apparaît-elle parfois vide, et pourquoi y a-t-il un décalage de 8 octets alors que ce n'est pas le cas ?

Pourquoi l'impression de l'adresse d'un membre char dans une classe apparaît-elle parfois vide, et pourquoi y a-t-il un décalage de 8 octets alors que ce n'est pas le cas ?

Susan Sarandon
Libérer: 2024-12-20 07:50:10
original
984 Les gens l'ont consulté

Why Does Printing the Address of a Char Member in a Class Sometimes Appear Blank, and Why Is There an 8-Byte Offset When It's Not?

Adresse de l'anomalie d'affichage des données Char

Dans un programme contenant une classe avec des données membres de différents types, int, char et chaîne, une observation inattendue émerge lors de l’impression des adresses de ces données membres. Pendant que les adresses de int et de string sont affichées, l'adresse du membre de données char apparaît vide.

Pour résoudre ce problème, considérez la représentation sous-jacente du type de données char. Lorsque vous obtenez l’adresse d’une variable char à l’aide de l’opérateur &, vous obtenez un pointeur vers un caractère. Cependant, l'opérateur d'insertion de flux (<<) interprète ce pointeur comme une chaîne terminée par un caractère C de style C. Par conséquent, il tente d'imprimer la chaîne associée au pointeur, qui est inexistante dans ce cas.

Pour rectifier ce comportement, convertissez explicitement l'adresse de la variable char en un pointeur vide à l'aide de static_cast. Ce faisant, vous demandez à l'opérateur d'insertion de flux d'interpréter la valeur comme une adresse plutôt que comme une chaîne.

<br>cout << "adresse du caractère :" << static_cast<void *>(&b) << endl;<br>

De plus, lorsque les données membres de la classe sont déclarées publiques, quelque chose d'intrigant se produit. L'adresse de la variable char est désormais affichée, mais avec un décalage de 8 octets par rapport à l'adresse de la variable int.

<br> ... int : quelque chose <br> .. . char : quelque chose_2<br> ... string : quelque chose_3<br>

Fait intéressant, quelque chose_2 - quelque chose vaut toujours 8. Cela provient du remplissage appliqué aux membres de la classe pour une disposition efficace de la mémoire. La variable char, bien qu'elle n'occupe qu'un seul octet, se voit attribuer 4 octets en raison des exigences d'alignement. Ce remplissage de 3 octets crée le décalage observé.

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