offsetof Makro Verständnisproblem



  • Hallo,

    ich habe ein wenig in dem Buch "C von A bis Z" von Jürgen Wolf gestöbert und bin dort auf das offsetof Makro gestoßen.

    #define offsetof(struct_type, member) (size_t) &(((struct_type *)0)->member)
    

    Es funktioniert auch wunderbar. Nur kann ich das ganze leider nicht nachvollziehen.
    Wofür das (size_t) ? Es funktioniert auch ohne wunderbar.
    Und warum ((struct_type *)0) ? Was bewirken 0 und * an der Stelle?
    Ich hoffe jemand kann mir das erklären. Wäre schön, wenn ich wüsste was ich da programmiere 😃

    Mit ratlosen Grüßen
    DerRatlose



  • von innen nach außen:
    (struct_type *)0 ist der Null-Zeiger, interpretiert als Zeiger auf deine Struktur
    &(struct_type *)->member ist die Adresse des Elements innerhalb der Struktur. Da du vom Null-Zeiger ausgegangen bist, liegt das n Bytes von der Null-Position entfernt und durch die Typumwandlung nach size_t kannst du diesen Abstand herausbekommen.

    Edit: Und Bücher von JW sind hier nicht besonders beliebt 😃



  • DerRatlose schrieb:

    ich habe ein wenig in dem Buch "C von A bis Z" von Jürgen Wolf gestöbert

    DerRatlose schrieb:

    Ich hoffe jemand kann mir das erklären.

    Nehmen wir mal NULL statt 0.
    (struct_type *)NULL ist dann ein Zeiger auf struct_type.
    ((struct_type *)0)->member ist dann das member vom ganzen Objekt, das an der Adresse 0 liegt.
    &(((struct_type *)0)->member) ist dann die Adresse vom member vom ganzen Objekt, das an der Adresse 0 liegt.
    Und genau das ist, wieviele Bytes das Member vom Startpunkt des ganzehn Objekts weg ist, also der offdet.
    (size_t) &(((struct_type *)0)->member) ist das noch nach size_t gecastet. Vorher wars nur vom Type ptrdiff_t.
    Ich frage mich, warum da keine Klammern drum sind.
    ((size_t) &(((struct_type *)0)->member))
    Gehört sich das nicht bei so Makros?



  • Danke für die schnellen und ausführlichen Antworten. Jetzt wo ich es verstanden habe ist der Aufbau ganz logisch 🙂

    CStoll schrieb:

    Edit: Und Bücher von JW sind hier nicht besonders beliebt 😃

    Ja, ich habe auch festgestellt, dass da manche Stellen nicht so wirklich Sinn ergeben oder dass doch der ein oder andere Fehler drin steckt. Hatte es als openbook gefunden und dachte es reicht wohl um meine Teilkenntnisse ein wenig zu sortieren und zu ergänzen.
    Nehme aber auch gerne Vorschläge für bessere Alternativen an 🙂



  • DerRatlose schrieb:

    Nehme aber auch gerne Vorschläge für bessere Alternativen an 🙂

    Selbst Wikipedia ist besser als JW.

    Die Fehler stecken überall. Z.Bsp. ist das Marko falsch angegeben. Ausserdem impliziert JW, dass es Non-Standard wäre.



  • offsetof ist ANSI C Standard, die jeweilige Implementierung ist Sache des Compilerbauers, d.h. nicht unbedingt überall gleich.
    Das eigene Rumfummeln an Standard-Headerdateien verbietet sich.
    Zum JW-Pfusch ist hier im Forum bereits vieles nachzulesen.



  • Ich hab mal eine Verständnisfrage ob meine Sichtweise richtig ist.
    Zuerst wird zeigt die struktur auf die Adresse 0 also die erste Adresse quasi damit beginnt das erste Element dieser struktur bei der Adresse 0 und "zählt" von da an hoch nun zeigt (((struct_type *)0)->member) eben auf einer dieser Elemente.
    Nun zeigt der Bildschirm mit einem Aufruf mit printf("%d",......) durch Zeiger-Arithmetik den Abstand von der Adresse 0 zur Adresse des Elements in Bytes an.
    Seh ich das richtig ? 😮


Anmelden zum Antworten