Bei Deklarieren einer Struktur gleich definieren



  • Nabend!
    Ich habe mal eine kurze Frage. Gibt es eine Möglichkeit, beim Deklarieren eines struct-Datentyps dessen Elemente gleich mit Daten zu füllen?
    Als Beispiel habe ich sockaddr_in. Ich möchte den Elemente sin_family und sin_port Werte zuweisen. In mehreren Zeilen würde dies so aussehen:

    #include <sys/socket.h>
    #include <arpa/inet.h>
    
    struct sockaddr_in beispiel;
    //Dann die Elemente nacheinander mit Werten füllen
    beispiel.sin_family = AF_INET;
    beispiel.sin_port = htons(80);
    

    Kann man auch bei der Deklaration (struct sockaddr_in beispiel) den Einzelnen Elementen Werte zuweisen oder müssen sie nacheinander befüllt werden?

    MfG
    Schäch



  • #include <stdio.h>
    
    struct test
    {
        int a;
        char b[256];
        double c;
    };
    
    void main (void)
    {
        struct test t = {123, "456", 7.89};
        printf ("%d %s %f", t.a, t.b, t.c);    
    }
    


  • -Matt schrieb:

    #include <stdio.h>
    
    struct test
    {
        int a;
        char b[256];
        double c;
    };
    
    void main (void)
    {
        struct test t = {123, "456", 7.89};
        printf ("%d %s %f", t.a, t.b, t.c);    
    }
    

    Dankeschön! Aber jetzt noch eine Stufe schwieriger. Ich möchte nur die beiden bestimmten Elemente sin_family und sin_port beim Deklarieren definieren.



  • struct sockaddr_in t = { AF_INET, htons(80) };
    


  • Gehen wir mal davon aus, die Bibliothek für sockaddr_in hat die Elemente auf jedem System an anderen Positionen, sodass ich den Namen des Elements angeben muss, weil ich die Reheinfolge der Elemente nicht kenne. Kann man dann das machen?:

    struct sockaddr_in beispiel = { sin_family = AF_INET, sin_port = htons(80) };
    


  • Hat sie nicht. Die Positionen der Basisstrukturen sind bei diesen Bibliotheken immer gleich, d.h. sie sind so spezifiziert, wenn sich daran was ändert, müsste sich auch die Spezifikation ändern; evtl. kommen bei neueren Versionen ein paar Strukturelemente dazu, dann aber nur hinten dran.
    Wenn du das nicht glaubst kannst du ein paar portable Prüfungen durchführen, z.B.

    assert( offsetof(struct sockaddr_in,sin_family) == 0);
    assert( offsetof(struct sockaddr_in,sin_family) < offsetof(struct sockaddr_in,sin_port));
    


  • Wutz schrieb:

    Hat sie nicht. Die Positionen der Basisstrukturen sind bei diesen Bibliotheken immer gleich, d.h. sie sind so spezifiziert, wenn sich daran was ändert, müsste sich auch die Spezifikation ändern; evtl. kommen bei neueren Versionen ein paar Strukturelemente dazu, dann aber nur hinten dran.
    Wenn du das nicht glaubst kannst du ein paar portable Prüfungen durchführen, z.B.

    assert( offsetof(struct sockaddr_in,sin_family) == 0);
    assert( offsetof(struct sockaddr_in,sin_family) < offsetof(struct sockaddr_in,sin_port));
    

    Vielen Dank! Diese Antwort ist goldwert.
    Habe noch mal eine Frage: Ist das Programm schneller, wenn ich die Deklaration und Definition in einem Schritt mache?



  • In C99 geht Folgendes:

    struct sockaddr_in beispiel = {
      .sin_family = AF_INET,
      .sin_port = htons(80)
    };
    

Anmelden zum Antworten