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:
data;
*data;
(*data).name;
(*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
Grijesh Chauhan
my_data ist eine Struktur mit name als Feld u data[] ist eine Reihe von Strukturen, Sie initialisieren jeden Index. folgendes lesen:
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:
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
David
Hier sind nur zwei Syntaxen im Spiel.
Einfache alte Array-Initialisierung:
int x[] = {0, 0}; // x[0] = 0, x[1] = 0
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
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.
13816900cookie-checkArray von Strukturen wird initialisiert [duplicate]yes
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