Initialiser une structure en C

Jinku Hu 12 octobre 2023
  1. Utiliser la notation de style de la liste d’initialisation pour initialiser une structure en C
  2. Utiliser la notation de la liste d’affectation pour initialiser une structure en C
  3. Utiliser l’affectation individuelle pour initialiser une structure en C
Initialiser une structure en C

Cet article présente plusieurs méthodes pour initialiser une structure en C.

Utiliser la notation de style de la liste d’initialisation pour initialiser une structure en C

Struct est probablement le mot-clé le plus important pour construire des structures de données complexes en C. C’est un objet intégré qui peut stocker plusieurs éléments hétérogènes appelés membres.

Notez que les structures sont définies uniquement avec le mot-clé struct, mais dans les exemples suivants, nous ajoutons typedef pour créer un nouveau nom de type et rendre les déclarations ultérieures plus lisibles.

Une fois que la structure est définie, nous pouvons déclarer une variable de ce type et l’initialiser avec la notation de liste. Cette syntaxe est similaire à la liste d’initialisation utilisée en C++. Dans ce cas, nous assignons à chaque membre de la struct un opérateur d’assignation explicite, mais nous ne pouvons spécifier que les valeurs dans l’ordre correct, ce qui serait suffisant dans les versions modernes du langage.

#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 main(void) {
  Person me = {
      .firstname = "John\0", .lastname = "McCarthy\0", .age = 24, .alive = 1};

  printf("Name: %s\nLast Name: %s\nAge: %d\nAlive: ", me.firstname, me.lastname,
         me.age);
  me.alive ? printf("Yes\n") : printf("No\n");

  exit(EXIT_SUCCESS);
}

Production :

Name: John
Last Name: McCarthy
Age: 24
Alive: Yes

Utiliser la notation de la liste d’affectation pour initialiser une structure en C

Il peut aussi y avoir un scénario dans lequel une struct déclarée n’est pas initialisée immédiatement et doit être affectée de valeurs plus tard dans le programme. Dans ce cas, nous devrions utiliser la syntaxe de type liste de l’initialisateur avec une notation supplémentaire comme préfixe. Le casting au type de struct est l’étape nécessaire pour compiler le programme.

#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 main(void) {
  Person me;

  me = (Person){
      .firstname = "John\0", .lastname = "McCarthy\0", .age = 24, .alive = 1};

  printf("Name: %s\nLast Name: %s\nAge: %d\nAlive: ", me.firstname, me.lastname,
         me.age);
  me.alive ? printf("Yes\n") : printf("No\n");

  exit(EXIT_SUCCESS);
}

Production :

Name: John
Last Name: McCarthy
Age: 24
Alive: Yes

Utiliser l’affectation individuelle pour initialiser une structure en C

Une autre méthode pour initialiser les membres de struct consiste à déclarer une variable puis à attribuer à chaque membre sa valeur correspondante séparément. Notez que les tableaux char ne peuvent pas être assignés avec une chaîne de caractères, ils doivent donc être copiés explicitement avec des fonctions supplémentaires comme memcpy ou memmove (voir manuel). Vous devez toujours garder à l’esprit que la longueur du tableau ne doit pas être inférieure à la chaîne de caractères stockée.

#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 main(void) {
  Person me2;

  memcpy(&me2.firstname, "Jane\0", 40);
  memcpy(&me2.lastname, "Delaney\0", 40);
  me2.age = 27;
  me2.alive = true;

  printf("Name: %s\nLast Name: %s\nAge: %d\nAlive: ", me2.firstname,
         me2.lastname, me2.age);
  me2.alive ? printf("Yes\n") : printf("No\n");

  exit(EXIT_SUCCESS);
}

Production :

Name: Jane
Last Name: Delaney
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