Betrachten Sie das folgende Beispielprogramm:
%Vor%Kompiliert mit:
%Vor%Die erwartete Ausgabe ist:
%Vor%Der C99-Standard sagt dies über das erste Mitglied einer Struktur:
C99 6.7.2.1 (13): Ein Zeiger auf ein Strukturobjekt, das entsprechend konvertiert wurde, zeigt auf sein Anfangselement ... und umgekehrt. Es kann ein unbenanntes Padding innerhalb eines Strukturobjekts geben, aber nicht am Anfang.
Im Beispielprogramm wird ein Zeiger auf struct embedded
in einen Zeiger auf struct base
(durch void*
) konvertiert, ohne dass eine explizite Umwandlung erforderlich ist.
Was, wenn stattdessen das erste Mitglied ein Zeiger auf die Basis ist wie in struct pointed
? Ich bin mir nicht sicher über die Besetzung in tobase_pointed
. Ohne den Cast wird Müll gedruckt, aber keine Kompilierung Warnungen / Fehler. Bei der Besetzung werden die korrekten Werte für base.a
und base.b
gedruckt, aber das bedeutet nicht viel, wenn ein undefiniertes Verhalten vorliegt.
Soll die Besetzung struct pointed
in ihr erstes Mitglied struct base*
korrekt konvertieren?
Der Code wird nicht nur umgewandelt, sondern auch der Zeiger auf den Zeiger auf struct-Basis dereferenziert. Dies ist notwendig, um den Zeiger zur Basis an erster Stelle zu erhalten.
Dies passiert in Ihrem Code, wenn die Funktion tobase_pointed
entfernt wurde:
bs
ist der Zeiger, der entsprechend konvertiert wurde, um auf das Anfangselement zu zeigen. Dein Code ist korrekt.
Diese Umwandlung ist gerechtfertigt, und Sie benötigen sie, weil Sie einen Zeiger in einen Zeiger auf Zeiger konvertieren möchten. Wenn Sie nicht casten, wird die Dereferenzierung falsch sein.
Mit anderen Worten, Ihre base*
hat dieselbe Adresse wie pt
object. Sie können also auf einen Zeiger auf pt zugreifen. Aber du musst es dereferenzieren.
Tags und Links c