Array von Structs in C initialisieren
- Verwenden Sie die Listennotation, um ein Array von Structs in C zu initialisieren
- Verwenden einer separaten Funktion und Schleife zum Initialisieren von Array-Strukturen in C
Dieser Artikel demonstriert mehrere Methoden, wie ein Array von struct
in C initialisiert werden kann.
Verwenden Sie die Listennotation, um ein Array von Structs in C zu initialisieren
Strukturen sind abgeleitete Datentypen, die normalerweise aus mehreren Mitgliedern bestehen. Beachten Sie, dass die Reihenfolge der Member-Deklarationen in der struct
-Definition wichtig ist, und wenn die Initialisierungsliste verwendet wird, folgt sie der gleichen Reihenfolge. Im folgenden Beispiel definieren wir ein struct
namens Person
, das 2 char
-Arrays, ein int
und ein bool
enthält. Folglich deklarieren wir ein Array von Person
-Strukturen und initialisieren es mit geschweiften Listen, wie wir es mit dem Array eines einzelnen Datentyps tun würden. Dann geben wir die initialisierten Array-Elemente mit Hilfe der for
-Schleife aus. Beachten Sie jedoch, dass char
-Arrays mit dem Formatbezeichner %s
ausgegeben werden, da wir in den Initialisierungslisten in jedem String-Literal \0
Byte enthalten haben.
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Person {
char firstname[40];
char lastname[40];
int age;
bool alive;
} Person;
int printPerson(Person *p) {
if (p == NULL) return -1;
printf("Name: %s\nLast Name: %s\nAge: %d\nAlive: ", p->firstname, p->lastname,
p->age);
p->alive ? printf("Yes\n") : printf("No\n");
return 0;
}
int main(void) {
Person arr[] = {
{"John\0", "McCarthy\0", 24, 1},
{"John\0", "Kain\0", 27, 1},
};
size_t size = sizeof arr / sizeof arr[0];
for (int i = 0; i < size; ++i) {
printPerson(&arr[i]);
printf("\n");
}
exit(EXIT_SUCCESS);
}
Ausgabe:
Name: John
Last Name: McCarthy
Age: 24
Alive: Yes
Name: John
Last Name: Kain
Age: 27
Alive: Yes
Verwenden einer separaten Funktion und Schleife zum Initialisieren von Array-Strukturen in C
Der Nachteil der vorherigen Methode ist, dass Arrays mit hart kodierten Werten initialisiert werden können, oder je größer das Array sein muss, desto größer wird die Initialisierungsanweisung. Daher sollten wir eine einzelne struct
-Element-Initialisierungsfunktion implementieren und diese aus der Iteration heraus aufrufen, um das struct
-Array zu erledigen. Beachten Sie, dass die Funktion initPerson
alle struct
-Elementwerte als Argumente nimmt und sie dem Objekt Person
zuweist, das ebenfalls als Parameter übergeben wurde. Schließlich geben wir jedes Element des Arrays mit der Funktion printPerson
auf der Konsole aus. Beachten Sie, dass wir nur zu Demonstrationszwecken dieselben Person
-Werte an die Initialisierungsfunktion übergeben.
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Person {
char firstname[40];
char lastname[40];
int age;
bool alive;
} Person;
int printPerson(Person *p) {
if (p == NULL) return -1;
printf("Name: %s\nLast Name: %s\nAge: %d\nAlive: ", p->firstname, p->lastname,
p->age);
p->alive ? printf("Yes\n") : printf("No\n");
return 0;
}
int initPerson(Person *p, char *fn, char *ln, int age, bool alive) {
if (p == NULL) return -1;
memmove(&p->firstname, fn, strlen(fn) + 1);
memmove(&p->lastname, ln, strlen(ln) + 1);
p->age = age;
p->alive = alive;
return 0;
}
enum { LENGTH = 10 };
int main(void) {
Person me = {"John\0", "McCarthy\0", 24, 1};
Person arr[LENGTH];
for (int i = 0; i < LENGTH; ++i) {
initPerson(&arr[i], me.firstname, me.lastname, me.age, me.alive);
}
for (int i = 0; i < LENGTH; ++i) {
printPerson(&arr[i]);
printf("\n");
}
exit(EXIT_SUCCESS);
}
Ausgabe:
Name: John
Last Name: McCarthy
Age: 24
Alive: Yes
Name: John
Last Name: Kain
Age: 27
Alive: Yes
...
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook