Initialisierung von Structs mit zeigern



  • Hallo,

    ich hab' ein struct, das ich wie folgt initialisieren und anschliessend einen zeiger darauf zusammenbastel.
    Verkürzter code ausschnitt:

    typedef struct { int a[20], b[20], c, d, e, f, g, h; } thing_t;
    thing_t os = {
    .b[0] = 0,
    .b[1] = 7,
    .e = 5
    };
    thing_t *pos = (thing_t*)&os.b[0];
    
    int b = pos->a[o];
    

    )
    Gibt es auch eine möglichkeit den zeiger schon bei der initialisierung zu haben?
    Ich dachte da an sowas in der art:
    (Funktioniert aber leider nicht: "syntax error before -> token")

    typedef struct { int a[20], b[20], c, d, e, f, g, h; } thing_t;
    thing_t *os = {
    ->b[0] = 0,
    ->b[1] = 7,
    ->e = 5
    };
    

    )

    Gibt es ferner einen weg, das ganz in einen header zu verbannen? (im moment ist es einfach global, aber das ist natürlich nicht so toll)

    Und schon mal vielen dank für die Geduld mit den vielen doofen fragen 🙂 :xmas2:



  • Hast du es mal mit . statt -> versucht?

    EDIT: Natürlich nicht bei der Initialisierung, sondern bei der Zuweisung, wobei du vorher schon Speicher alloziert haben musst.



  • ein thing_t* os ist kein struct, sondern "nur" ein Zeiger - also mußt du ihm auch die Adresse eines existierenden Objekts übergeben (wobei das auch ein per malloc() angeforderter Speicherblock sein kann).

    Übrigens zeigt dein thing_t *pos = (thing_t*)&os.b[0]; irgendwo in die Mitte des structs - und das ist zumindest potentiell ungesund.



  • @ Bashar: klar hab ich das versucht, aber nur bei der initialisierung 😉

    @ CStoll: Du hast natürlich recht damit, daß es hier thing_t *pos = (thing_t*)&os.a[0]; heissen muss. Im echten code sitzt der zeiger richtg. :xmas2:

    Auf malloc würde ich gern verzichten.
    Wird wohl nicht anders gehen dann 😕

    Trotzdem danke!



  • YogiTee schrieb:

    thing_t *pos = (thing_t*)&os.b[0];
    

    Wozu so umständlich? Reicht denn

    thing_t *pos = &os;
    

    nicht aus? Oder übersehe ich irgendwas?


Anmelden zum Antworten