Zeigt ein Zeiger auf eine Struktur in C immer auf ihr erstes Mitglied?

Lesezeit: 3 Minuten

Benutzer-Avatar
Steve

Angenommen, ich habe eine Reihe von C-Strukturen, für die ich einen bestimmten Satz von Funktionen verwenden möchte.

Ich frage mich, ob das Folgende ein legitimer Ansatz ist:

typedef struct Base {
     int exampleMember;
     // ...
} Base;

typedef struct Foo {
     Base base;
     // ...
} Foo;

typedef struct Bar {
     Base base;
     // ...
} Bar;

void MethodOperatesOnBase(void *);

void MethodOperatesOnBase(void * obj)
{
     Base * base = obj;
     base->exampleMember++;
}

Im Beispiel werden Sie feststellen, dass beide Strukturen Foo und Bar beginne mit a Base Mitglied.

Und das drin MethodOperatesOnBaseich werfe die void * Parameter zu Base *.

Ich möchte Hinweise auf übergeben Bar und Hinweise auf Foo zu dieser Methode und verlassen Sie sich darauf, dass das erste Mitglied der Struktur a ist Base Struktur.

Ist dies akzeptabel oder gibt es einige (möglicherweise Compiler-spezifische) Probleme, die ich beachten muss? (Zum Beispiel eine Art Pack-/Padding-Schema, das die Position des ersten Mitglieds einer Struktur ändern würde?)

  • Gibt es einen Grund, warum Sie nicht nur C++ verwenden?

    – Jonathan Grynspan

    5. September 2011 um 20:43 Uhr

  • Ja. Aber Punkt gut getroffen. Ich versuche, einen supereinfachen Vererbungsmechanismus für eine begrenzte Anzahl von Strukturen in meinem Projekt zu imitieren.

    – Steve

    5. September 2011 um 20:46 Uhr

  • Ich verstehe, was Sie sagen, aber ich kann nicht für dieses Projekt.

    – Steve

    5. September 2011 um 20:51 Uhr

  • Is this homework? Ich war 10 Jahre lang nicht in der Schule, aber danke. LOL

    – Steve

    5. September 2011 um 20:53 Uhr

  • @Jonathan Grynspan: Das ist eine berechtigte Frage. Angenommen, Ihr Programm ist 10.000 Zeilen lang und in C geschrieben. Dann haben Sie ungefähr 100 Zeilen, in denen Sie dieses Struktur-Wortspiel durchführen müssen. In diesem Fall lohnt es sich wahrscheinlich, etwas mehr Aufwand zu betreiben, um das gesamte Programm in C kompatibel zu halten.

    – Mystisch

    5. September 2011 um 21:04 Uhr


Benutzer-Avatar
hmakholm hat Monica übrig gelassen

Ja, die C-Norm garantiert ausdrücklich, dass dies funktioniert.

(C1x §6.7.2.1.13: „Ein Zeiger auf ein Strukturobjekt, geeignet konvertiert, zeigt auf sein Anfangselement … und umgekehrt. Es kann unbenannte Auffüllung innerhalb eines Strukturobjekts geben, aber nicht an seinem Anfang.“)

  • @MByD: Die Standards selbst sind aus dummen Urheberrechtsgründen nicht verlinkbar, aber Google kann mehrere Entwürfe für Sie finden.

    – hmakholm hat Monica übrig gelassen

    18. September 2011 um 12:29 Uhr

  • 6.7.2.1.15 im Komitee-Entwurf: C11-Standard hier gefunden: open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

    – Eric Hou

    3. Oktober 2016 um 21:26 Uhr

Das ganze gtk+ ist so implementiert. Mir fällt kein besseres Beispiel ein. Schauen Sie sich an http://git.gnome.org/browse/gtk+/tree/gtk/

Ich widerspreche keiner der Antworten, die sagen, dass das, was Sie vorgeschlagen haben, funktionieren wird, aber im Interesse einer vollständigeren Diskussion (ohne vorzuschlagen, dass Sie C ++ verwenden!), Warum nicht so etwas tun?

typedef struct Base ...  /* The types defined exactly as before */
typedef struct Foo ...
typedef struct Bar ...

/* The function takes a Base* since that is what it actually works with*/
void MethodOperatesOnBase(Base* pbase)
{
    /* Do something... */
}

/* Now call it like this: */
Foo foo;
Bar bar;

MethodOperatesOnBase(&foo.base);
MethodOperatesOnBase(&bar.base);

Gibt es einen Grund, der nicht funktioniert und Sie verwenden müssen void *? Ich sehe nicht, dass dies viel mehr Arbeit ist und den Vorteil der Typsicherheit hat.

  • Nun, in meinem speziellen Fall ist der Grund, weil Foo und Bar werden als undurchsichtige Zeiger exponiert.

    – Steve

    5. September 2011 um 21:39 Uhr


  • @Steve: OK, der Anrufer kann also nicht auf die verweisen base Mitglied und Sie müssen dies tun, indem Sie den Strukturzeiger neu interpretieren. Das macht Sinn, danke für die Klarstellung.

    – AAT

    5. September 2011 um 21:48 Uhr

1384570cookie-checkZeigt ein Zeiger auf eine Struktur in C immer auf ihr erstes Mitglied?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy