Retourner une structure à partir d'une fonction en C

Jinku Hu 12 octobre 2023
  1. Utilisez la notation standard pour retourner struct à partir de la fonction
  2. Utilisez la notation de pointeur pour renvoyer struct à partir de la fonction
Retourner une structure à partir d'une fonction en C

Cet article montre plusieurs méthodes sur la façon de renvoyer un struct à partir d’une fonction en C.

Utilisez la notation standard pour retourner struct à partir de la fonction

Le mot clé struct en C est utilisé pour implémenter des structures de données définies par l’utilisateur. Puisque nous définissons le type struct dans cet exemple, ce sera une notation plus propre pour les déclarations de fonction si nous tapons la structure MyStruct. Il associera un nouvel alias de type pour la structure donnée, et nous n’aurions besoin de spécifier que le nouveau nom d’alias dans le prototype de fonction. Désormais, les fonctions en C peuvent renvoyer la struct similaire aux types de données intégrés.

Dans l’exemple de code suivant, nous avons implémenté une fonction clearMyStruct qui prend un pointeur vers l’objet MyStruct et renvoie le même objet par valeur. Notez que nous devons accéder aux membres struct en utilisant l’opérateur ->lorsque le handle est le pointeur vers struct.

#include <stdio.h>
#include <stdlib.h>

enum { DAY = 9, MONTH = 2 };

typedef struct {
  int day;
  int month;
} MyStruct;

MyStruct clearMyStruct(MyStruct *st) {
  st->day = 0;
  st->month = 0;

  return *st;
}

int setMyStruct(MyStruct *st, int d, int m) {
  if (!st) return -1;
  st->day = d;
  st->month = m;
  return 0;
}

int main() {
  MyStruct tmp;

  if (setMyStruct(&tmp, DAY, MONTH) == -1) exit(EXIT_FAILURE);

  printf("day: %d\nmonth: %d\n", tmp.day, tmp.month);
  clearMyStruct(&tmp);
  printf("day: %d\nmonth: %d\n", tmp.day, tmp.month);

  exit(EXIT_SUCCESS);
}

Production:

day: 9
month: 2
day: 0
month: 0

Utilisez la notation de pointeur pour renvoyer struct à partir de la fonction

Généralement, les structures de données définies par struct ont tendance à contenir plusieurs membres de données résultant en une grande empreinte mémoire. Maintenant, quand il s’agit de passer des structures relativement grandes entre des fonctions, il est préférable d’utiliser des pointeurs. Le pointeur sert de poignée à l’objet et sa taille est fixe quelle que soit la structure qui y est stockée. L’utilisation de pointeurs pour renvoyer struct réduit potentiellement le trafic mémoire et donne au code plus de performances. Bien que le programme soit compilé avec des indicateurs d’optimisation, il peut implicitement modifier les instructions de transmission de données. Notez que nous avons utilisé le type enum pour déclarer des valeurs entières constantes nommées.

#include <stdio.h>
#include <stdlib.h>

enum { DAY = 9, MONTH = 2 };

typedef struct {
  int day;
  int month;
} MyStruct;

MyStruct *clearMyStruct2(MyStruct *st) {
  st->day = 0;
  st->month = 0;

  return st;
}

int setMyStruct(MyStruct *st, int d, int m) {
  if (!st) return -1;
  st->day = d;
  st->month = m;
  return 0;
}

int main() {
  MyStruct tmp;

  if (setMyStruct(&tmp, DAY, MONTH) == -1) exit(EXIT_FAILURE);

  printf("day: %d\nmonth: %d\n", tmp.day, tmp.month);
  clearMyStruct2(&tmp);
  printf("day: %d\nmonth: %d\n", tmp.day, tmp.month);

  exit(EXIT_SUCCESS);
}

Production:

day: 9
month: 2
day: 0
month: 0
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