Allocation dynamique d'un tableau en C

Jinku Hu 12 octobre 2023
  1. Utiliser la fonction malloc pour allouer un tableau dynamiquement en C
  2. Utilisez la fonction realloc pour modifier la zone de mémoire déjà allouée en C
  3. Utiliser une macro pour implémenter l’allocation pour un tableau d’objets donnés en C
Allocation dynamique d'un tableau en C

Cet article présente plusieurs méthodes d’allocation dynamique d’un tableau en C.

Utiliser la fonction malloc pour allouer un tableau dynamiquement en C

La fonction malloc est la fonction principale pour l’allocation de la mémoire dynamique sur le tas. Elle alloue le nombre d’octets donné et renvoie le pointeur vers la zone de mémoire. Ainsi, si l’on veut allouer dynamiquement un tableau de certains types d’objets, il faut d’abord déclarer un pointeur vers le type. Ensuite, malloc doit être appelé en passant en argument le nombre d’éléments multiplié par la taille de l’objet unique.

Dans l’exemple suivant, nous allouons la mémoire pour stocker une chaîne de caractères. errno est mis à 0 comme requis par le standard de codage sécurisé, et le pointeur renvoyé par l’appel malloc est vérifié pour vérifier l’exécution réussie de la fonction. Enfin, la fonction memmove est utilisée pour copier la chaîne de caractères à l’emplacement mémoire alloué.

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

#define SIZE 100

const char *str = "random string to be moved";

int main() {
  char *arr = NULL;

  errno = 0;
  arr = malloc(SIZE * sizeof(char));
  if (!arr) {
    perror("malloc");
    exit(EXIT_FAILURE);
  }

  memmove(arr, str, strlen(str));
  printf("arr: %s\n", arr);

  free(arr);
  exit(EXIT_SUCCESS);
}

Production :

arr: random string to be moved

Utilisez la fonction realloc pour modifier la zone de mémoire déjà allouée en C

La fonction realloc est utilisée pour modifier la taille de la région mémoire précédemment allouée par l’appel malloc. Elle prend l’adresse mémoire d’origine et la nouvelle taille comme second argument. Notez que realloc peut renvoyer le même pointeur que celui qui a été passé ou un pointeur différent en fonction de la taille demandée et de la mémoire disponible après l’adresse donnée. En attendant, le contenu du tableau précédent restera inchangé jusqu’à une nouvelle taille spécifiée.

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

#define SIZE 100

const char *str = "random string to be moved";

int main() {
  char *arr = NULL;

  errno = 0;
  arr = malloc(SIZE);
  if (!arr) {
    perror("malloc");
    exit(EXIT_FAILURE);
  }

  int num = 102;  // User Provided Value
  for (int i = 0; i < num; ++i) {
    if (i > SIZE) {
      arr = realloc(arr, 2 * SIZE);

      if (!arr) {
        perror("realloc");
        exit(EXIT_FAILURE);
      }
    }

    arr[i] = 'a';
  }

  free(arr);
  exit(EXIT_SUCCESS);
}

Utiliser une macro pour implémenter l’allocation pour un tableau d’objets donnés en C

Habituellement, malloc est utilisé pour allouer un ensemble de certaines structures définies par l’utilisateur. Puisque le malloc renvoie le pointeur void et peut être implicitement attribué à n’importe quel autre type, une meilleure pratique consiste à attribuer explicitement le pointeur renvoyé au type correspondant. Comme il est relativement facile de rater des choses et de ne pas inclure la notation correcte, nous avons implémenté une macro expression qui prend le nombre d’éléments dans le tableau et le type d’objet pour construire automatiquement l’instruction malloc correcte, y compris le cast correct.

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

#define SIZE 100

typedef enum {
  Jan,
  Feb,
  MAR,
  APR,
  MAY,
  JUN,
  JUL,
  AUG,
  SEP,
  OCT,
  NOV,
  DEC
} month;

typedef struct {
  unsigned char dd;
  month mm;
  unsigned yy;
} date;

#define MALLOC_ARRAY(number, type) ((type *)malloc((number) * sizeof(type)))

int main() {
  date *d = NULL;

  errno = 0;
  d = MALLOC_ARRAY(SIZE, date);
  if (!d) {
    perror("malloc");
    exit(EXIT_FAILURE);
  }

  free(d);
  exit(EXIT_SUCCESS);
}
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 Array