Initialiser un tableau de structures en C

Jinku Hu 12 octobre 2023
  1. Utiliser la notation de liste pour initialiser un tableau de structures en C
  2. Utiliser une fonction et une boucle distinctes pour initialiser un tableau de structures en C
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

...
Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Article connexe - C Struct