Array von Strukturen wird initialisiert [duplicate]

Lesezeit: 5 Minuten

Benutzer-Avatar
zubergu

Hier ist die Initialisierung, die ich gerade in der Frage eines anderen gefunden habe.

my_data data[]={
    { .name = "Peter" },
    { .name = "James" },
    { .name = "John" },
    { .name = "Mike" }
};

Ich habe so etwas noch nie zuvor gesehen und kann keine Erklärung finden, wie es möglich ist, dass .name korrekt ist.
Was ich suche, ist, wie Schritt für Schritt dieser Prozess abläuft.

Es sieht aus wie es wird:

  1. data;
  2. *data;
  3. (*data).name;
  4. (*data).name="Peter";

Oder liege ich total falsch?

  • Es ist nur C99, das seit 14 Jahren ein C-Standard ist.

    – PaulR

    20. September 2013 um 16:29 Uhr


  • Schritt für Schritt? Sie müssen vertraut sein int a[2] = {0,0} Syntax. Das einzige, was Sie nicht wissen, ist {.name = "foo"}was mir selbsterklärend erscheint!

    – David

    20. September 2013 um 16:31 Uhr

  • @PaulR, der aktuelle C-Standard ist C11 …

    – Jens Gustedt

    20. September 2013 um 16:31 Uhr

  • @Jens: guter Punkt – Kommentar aktualisiert!

    – PaulR

    20. September 2013 um 16:33 Uhr

  • Das war wirklich wertvoll für mich, weil ich mich gefragt habe, wie ich ein Array von Strukturen initialisieren kann, ohne den Verstand zu verlieren.

    – Gerstenmann

    30. Oktober 2017 um 16:38 Uhr

Benutzer-Avatar
Grijesh Chauhan

my_data ist eine Struktur mit name als Feld u data[] ist eine Reihe von Strukturen, Sie initialisieren jeden Index. folgendes lesen:

5.20 Ausgewiesene Initialisierer:

Geben Sie in einem Strukturinitialisierer den Namen eines Felds an, mit dem initialisiert werden soll .fieldname=" vor dem Elementwert. Zum Beispiel bei folgender Struktur:

struct point { int x, y; };

folgende Initialisierung

struct point p = { .y = yvalue, .x = xvalue };

ist äquivalent zu

struct point p = { xvalue, yvalue };

Eine andere Syntax, die die gleiche Bedeutung hat und seit GCC 2.5 veraltet ist, ist fieldname:"wie hier gezeigt:

struct point p = { y: yvalue, x: xvalue };

Sie können auch schreiben:

my_data data[] = {
    { .name = "Peter" },
    { .name = "James" },
    { .name = "John" },
    { .name = "Mike" }
};

wie:

my_data data[] = {
    [0] = { .name = "Peter" },
    [1] = { .name = "James" },
    [2] = { .name = "John" },
    [3] = { .name = "Mike" }
}; 

oder:

my_data data[] = {
    [0].name = "Peter",
    [1].name = "James",
    [2].name = "John",
    [3].name = "Mike"
}; 

Zweite und dritte Form können praktisch sein, da Sie nicht schreiben müssen, um beispielsweise alle obigen Beispiele zu entsprechen:

my_data data[] = {
    [3].name = "Mike",
    [1].name = "James",
    [0].name = "Peter",
    [2].name = "John"
}; 

Wenn Sie mehrere Felder in Ihrer Struktur haben (z. B. an int age), können Sie alle auf einmal initialisieren, indem Sie Folgendes verwenden:

my_data data[] = {
    [3].name = "Mike",
    [2].age = 40,
    [1].name = "James",
    [3].age = 23,
    [0].name = "Peter",
    [2].name = "John"
}; 

Um die Array-Initialisierung zu verstehen, lesen Sie Strange initializer expression?

Darüber hinaus möchten Sie vielleicht auch die Antwort von @Shafik Yaghmour für switch case lesen: What is „…“ in switch-case in C code

Benutzer-Avatar
David

Hier sind nur zwei Syntaxen im Spiel.

  1. Einfache alte Array-Initialisierung:

    int x[] = {0, 0}; // x[0] = 0, x[1] = 0
    
  2. EIN ausgewiesener Initialisierer. Siehe die akzeptierte Antwort auf diese Frage: So initialisieren Sie eine Struktur gemäß den C-Programmiersprachenstandards

    Die Syntax ist jedoch ziemlich selbsterklärend. Sie können wie folgt initialisieren:

    struct X {
        int a;
        int b;
    }
    struct X foo = { 0, 1 }; // a = 0, b = 1
    

    oder um eine Bestellung zu verwenden,

    struct X foo = { .b = 0, .a = 1 }; // a = 1, b = 0
    

  • In Ihren Beispielen geht es um Strukturen, nicht um Arrays von Strukturen

    – Jangorecki

    6. Dezember 2018 um 7:52 Uhr

  • @jangorecki Ich habe das Problem zerlegt; Das erste Beispiel handelt von der Array-Initialisierung und das zweite von der Struct-Initialisierung. Kombinieren Sie die beiden und Sie können sehen, wie die gepostete Syntax des OP funktioniert, um ein Array von Strukturen zu initialisieren, was hier die Frage war.

    – David

    6. Dezember 2018 um 12:48 Uhr

  • Ja, aber “die beiden kombinieren” war eigentlich schwierig zu erreichen … jedenfalls war Ihre Antwort für mich die nützlichste unter vielen, die ich gesehen habe. Wird Downvote entfernen, wenn es möglich ist.

    – Jangorecki

    7. Dezember 2018 um 4:59 Uhr

Hier gibt es kein „Schritt für Schritt“. Wenn die Initialisierung mit konstanten Ausdrücken durchgeführt wird, wird der Prozess im Wesentlichen zur Kompilierzeit durchgeführt. Wenn das Array als lokales Objekt deklariert ist, wird es natürlich lokal zugewiesen und zur Laufzeit initialisiert, aber das kann immer noch als ein Einzelschrittprozess betrachtet werden, der nicht sinnvoll unterteilt werden kann.

Mit designierten Initialisierern können Sie einen Initialisierer für ein bestimmtes Mitglied eines Strukturobjekts (oder ein bestimmtes Element eines Arrays) bereitstellen. Alle anderen Mitglieder werden mit Null initialisiert. Also, wenn my_data wird als deklariert

typedef struct my_data {
  int a;
  const char *name;
  double x;
} my_data;

dann deine

my_data data[]={
    { .name = "Peter" },
    { .name = "James" },
    { .name = "John" },
    { .name = "Mike" }
};

ist einfach eine kompaktere Form von

my_data data[4]={
    { 0, "Peter", 0 },
    { 0, "James", 0 },
    { 0, "John", 0 },
    { 0, "Mike", 0 }
};

Ich hoffe, Sie wissen, was letzteres tut.

Es heißt ausgewiesener Initialisierer die in C99 eingeführt wird. Es wird zum Initialisieren verwendet struct oder Arrays, in diesem Beispiel, struct.

Gegeben

struct point { 
    int x, y;
};

folgende Initialisierung

struct point p = { .y = 2, .x = 1 };

entspricht dem C89-Stil

struct point p = { 1, 2 };

Es ist ein ausgewiesener Initialisierer, eingeführt mit dem C99-Standard; Es ermöglicht Ihnen, bestimmte Mitglieder eines Struct- oder Union-Objekts nach Namen zu initialisieren. my_data ist offensichtlich ein typedef für a struct Typ, der ein Mitglied hat name des Typs char * oder char [N].

Das ist ganz einfach:
my_data ist ein zuvor definierter Strukturtyp. Sie möchten also eine deklarieren my_data-Array einiger Elemente, wie Sie es mit tun würden

char a[] = { 'a', 'b', 'c', 'd' };

Das Array hätte also 4 Elemente und Sie initialisieren sie als

a[0] = 'a', a[1] = 'b', a[1] = 'c', a[1] ='d';

Dies wird als designierter Initialisierer bezeichnet (wie ich mich richtig erinnere).

und es zeigt nur an, dass die Daten vom Typ sein müssen my_dat und muss ein Array sein, das so viele my_data-Strukturen speichern muss, dass es eine Struktur mit den Namen jedes Typmitglieds Peter, James, John und Mike gibt.

1381690cookie-checkArray von Strukturen wird initialisiert [duplicate]

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

Privacy policy