Initialiser un tableau de structures en C
- Utiliser la notation de liste pour initialiser un tableau de structures en C
- Utiliser une fonction et une boucle distinctes pour initialiser un tableau de structures en C
Cet article montre plusieurs méthodes sur la façon d’initialiser un tableau de struct
en C.
Utiliser la notation de liste pour initialiser un tableau de structures en C
Les structures sont des types de données dérivés qui se composent généralement de plusieurs membres. Notez que l’ordre de déclaration des membres dans la définition de struct
est important, et que lorsque la liste d’initialisation est utilisée, elle suit le même ordre. Dans l’exemple suivant, nous définissons un struct
nommé Person
, qui comprend 2 tableaux char
, un int
et un bool
. Par conséquent, nous déclarons un tableau de structures Person
et l’initialisons avec des listes entre accolades comme nous le ferions pour le tableau de type de données unique. Ensuite, nous sortons les éléments du tableau initialisés en utilisant la boucle for
. Attention cependant, les tableaux char
sont imprimés avec le spécificateur de format %s
puisque nous avons inclus l’octet \0
dans chaque chaîne littérale dans les listes d’initialisation.
#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);
}
Production:
Name: John
Last Name: McCarthy
Age: 24
Alive: Yes
Name: John
Last Name: Kain
Age: 27
Alive: Yes
Utiliser une fonction et une boucle distinctes pour initialiser un tableau de structures en C
L’inconvénient de la méthode précédente est que le tableau peut être initialisé avec des valeurs codées en dur, ou plus le tableau doit être grand, plus l’instruction d’initialisation sera grande. Ainsi, nous devrions implémenter une seule fonction d’initialisation d’élément struct
et l’appeler à partir de l’itération pour faire le tableau struct
. Notez que la fonction initPerson
prend toutes les valeurs des membres struct
comme arguments et les assigne à l’objet Person
qui a également été passé comme paramètre. Enfin, nous sortons chaque élément du tableau sur la console en utilisant la fonction printPerson
. Notez que nous transmettons les mêmes valeurs Person
à la fonction d’initialisation à des fins de démonstration uniquement.
#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);
}
Production:
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