Heim >Backend-Entwicklung >C++ >Warum erscheint das Drucken der Adresse eines Char-Mitglieds in einer Klasse manchmal leer und warum gibt es einen 8-Byte-Offset, wenn dies nicht der Fall ist?

Warum erscheint das Drucken der Adresse eines Char-Mitglieds in einer Klasse manchmal leer und warum gibt es einen 8-Byte-Offset, wenn dies nicht der Fall ist?

Susan Sarandon
Susan SarandonOriginal
2024-12-20 07:50:101019Durchsuche

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 der Char-Datenanzeigeanomalie

In einem Programm, das eine Klasse mit Datenelementen verschiedener Typen, int, char und string, enthält, Beim Drucken der Adressen dieser Datenelemente tritt eine unerwartete Beobachtung auf. Während die Adressen von int und string angezeigt werden, erscheint die Adresse des char-Datenelements leer.

Um dieses Problem zu beheben, betrachten Sie die zugrunde liegende Darstellung des char-Datentyps. Wenn Sie die Adresse einer char-Variablen mit dem &-Operator ermitteln, erhalten Sie einen Zeiger auf ein char. Der Stream-Einfügungsoperator (<<) interpretiert diesen Zeiger jedoch als nullterminierte Zeichenfolge im C-Stil. Folglich wird versucht, die mit dem Zeiger verknüpfte Zeichenfolge auszugeben, die in diesem Fall nicht vorhanden ist.

Um dieses Verhalten zu beheben, wandeln Sie die Adresse der char-Variablen mithilfe von static_cast explizit in einen ungültigen Zeiger um. Dadurch weisen Sie den Stream-Einfügungsoperator an, den Wert als Adresse und nicht als Zeichenfolge zu interpretieren.

<br>cout << "Adresse des Zeichens:" << static_cast<void *>(&b) << endl;<br>

Außerdem passiert etwas Interessantes, wenn die Klassendatenmitglieder als öffentlich deklariert werden. Die Adresse der char-Variablen wird nun angezeigt, jedoch mit einem Offset von 8 Bytes gegenüber der Adresse der int-Variablen.

<br> ... int : Something <br> .. . char : Something_2<br> ... string : Something_3<br>

Interessanterweise Something_2 – Something ist immer 8. Dies liegt an der auf die Klassenmitglieder angewendeten Auffüllung für ein effizientes Speicherlayout. Obwohl die Variable char nur 1 Byte belegt, werden ihr aufgrund von Ausrichtungsanforderungen 4 Bytes zugewiesen. Diese 3-Byte-Auffüllung erzeugt den beobachteten Offset.

Das obige ist der detaillierte Inhalt vonWarum erscheint das Drucken der Adresse eines Char-Mitglieds in einer Klasse manchmal leer und warum gibt es einen 8-Byte-Offset, wenn dies nicht der Fall ist?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn