Konvertieren eines Zeigers in eine Struktur in das erste Element

8

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?

    
Adam 22.01.2016, 21:01
quelle

2 Antworten

2

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:

%Vor%

bs ist der Zeiger, der entsprechend konvertiert wurde, um auf das Anfangselement zu zeigen. Dein Code ist korrekt.

    
2501 22.01.2016, 21:26
quelle
1

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.

    
SergeyA 22.01.2016 21:13
quelle

Tags und Links