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