Heim >Backend-Entwicklung >C++ >Warum wird die Adresse meines C-Char-Mitglieds leer gedruckt und warum gibt es einen 8-Byte-Offset?
Fehler beim Debuggen von Adressendrucken
In einem C-Programm, das eine Klasse mit int-, char- und string-Datenelementen umfasst, löst das Drucken ihrer Adressen einen Fehler aus Augenbraue. Beim Zugriff auf das char-Mitglied bleibt die Ausgabe auf mysteriöse Weise leer. Darüber hinaus wird beim Umwandeln eines öffentlichen char-Mitglieds in einen Void-Zeiger ein Offset von 8 angezeigt, was zu weiteren Untersuchungen führt.
Fehlende Char-Adresse:
Das Problem mit der leeren char-Adresse Die Ausgabe ergibt sich aus der Art und Weise, wie der &-Operator interpretiert wird. Standardmäßig gibt die Verwendung von & für eine char-Variable einen Zeiger auf eine Zeichenfolge im C-Stil (char) zurück. Dies führt dazu, dass das überlastete << Operator für String-Streams, um die Variable als Array von Zeichen zu behandeln und sie als String und nicht als Adresse auszugeben.
Problem lösen:
So drucken Sie die Um die Adresse des char-Mitglieds korrekt anzuzeigen, ist eine explizite Umwandlung in void* erforderlich. Diese Umwandlung gibt an, dass der Zeiger als generischer Zeiger behandelt werden soll, um zu verhindern, dass << verhindert, dass der Operator es als C-String interpretiert. Der korrigierte Code:
cout << "address of char :" << (void*) &b << endl;
Alternativ ist die Verwendung von static_cast eine sicherere und bevorzugte Methode zum Umwandeln von Zeigern in modernem C:
cout << "address of char :" << static_cast( &b ) << endl; Offset von 8 in öffentlichen Membern:
Wenn die Mitglieder int, char und string öffentlich sind, wird der Versatz zwischen den Adressen von char und Die Anzahl der String-Mitglieder beträgt immer 8. Dies liegt daran, dass in einer öffentlichen Klasse die Mitgliedsvariablen in der Reihenfolge, in der sie deklariert werden, innerhalb der Klassenstruktur angeordnet sind. Daher folgt das String-Element dem char-Element mit einem festen Offset von 8 Byte.
Das obige ist der detaillierte Inhalt vonWarum wird die Adresse meines C-Char-Mitglieds leer gedruckt und warum gibt es einen 8-Byte-Offset?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!