it-swarm.com.de

Array von Strukturen wird initialisiert

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 gesehen und kann keine Erklärung finden, wie .name möglich ist, um richtig zu sein.
Ich suche, wie dieser Prozess Schritt für Schritt verläuft.

Es sieht so aus, als würde es:

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

Oder bin ich total falsch?

19
zubergu

Es gibt hier nur zwei Syntaxen.

  1. Einfache alte Array-Initialisierung:

    int x[] = {0, 0}; // x[0] = 0, x[1] = 0
    
  2. Ein bezeichneter Initialisierer. Sehen Sie sich die akzeptierte Antwort auf diese Frage an: Wie initialisiere ich eine Struktur gemäß den Standards der C-Programmiersprache

    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
    
21
Dave

my_data ist eine Struktur mit name als Feld und data[] ist eine Struktur von Strukturen. Sie initialisieren jeden Index. Lesen Sie folgendes: 

5.20 Designierte Initialisierer :

Geben Sie in einem Strukturinitialisierer den Namen eines Felds an, das mit .fieldname =' vor dem Elementwert initialisiert werden soll. Zum Beispiel, gegeben der folgenden Struktur,

 struct point { int x, y; };

die 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, die 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" }
}; 

Das zweite Formular kann praktisch sein, da Sie nicht schreiben müssen, um beispielsweise oben zu entsprechen: 

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

Lesen der Array-Initialisierung read Strange Initializer-Ausdruck
Zusätzlich können Sie auch die Antwort von @ Shafik Yaghmour für den Schalterfall lesen: Was ist "..." im Schalterfall im C-Code

19
Grijesh Chauhan

Hier gibt es keine "Schritt für Schritt". Wenn die Initialisierung mit konstanten Ausdrücken durchgeführt wird, wird der Prozess im Wesentlichen zur Kompilierzeit ausgeführt. Wenn das Array als lokales Objekt deklariert ist, wird es natürlich lokal zugewiesen und zur Laufzeit initialisiert. Dies kann jedoch immer noch als ein einstufiger Prozess angesehen werden, der nicht sinnvoll unterteilt werden kann.

Mit designierten Initialisierern können Sie einen Initialisierer für ein bestimmtes Element eines Strukturobjekts (oder ein bestimmtes Element eines Arrays) bereitstellen. Alle anderen Member werden mit Null initialisiert. Wenn also my_data als deklariert ist

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 das Letztere tut.

13
AnT

Es heißt designierter Initialisierer , der in C99 eingeführt wird. Es wird verwendet, um struct oder Arrays zu initialisieren, in diesem Beispiel struct.

Gegeben

struct point { 
    int x, y;
};

die folgende Initialisierung

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

entspricht dem C89-Stil

struct point p = { 1, 2 };
2
Yu Hao

Dies ist ziemlich einfach: my_data ist ein zuvor definierter Strukturtyp . Sie möchten also ein my_data- Array einiger Elemente deklarieren, wie Sie dies auch tun würden 

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

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

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

Dies wird als festgelegter Initialisierer bezeichnet (wie ich mich recht erinnere).

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

1
dhein

Es ist ein benannter Initialisierer , der mit dem C99-Standard eingeführt wurde; Damit können Sie bestimmte Mitglieder eines Struktur- oder Union-Objekts nach Namen initialisieren. my_data ist offensichtlich ein typedef für einen struct-Typ mit einem Member name vom Typ char * oder char [N]

0
John Bode