Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Industrial programming >> Langue C

Gestion de la mémoire dynamique en C : calloc, malloc et free expliqués

Ce chapitre explique la gestion de la mémoire dynamique en C. Le langage C fournit plusieurs fonctions pour l'allocation et la gestion de la mémoire. Ces fonctions se trouvent dans le fichier d'en-tête <stdlib.h>.

N° Fonction & Description
1

void *calloc(size_t nmemb, size_t size);

Alloue un tableau de nmemb éléments, chacun de taille size octets, et initialise la mémoire à zéro.

2

void free(void *ptr);

Libère un bloc de mémoire précédemment alloué pointé par ptr.

3

void *malloc(size_t size);

Alloue size octets de mémoire non initialisée.

4

void *realloc(void *ptr, size_t size);

Redimensionne le bloc de mémoire pointé par ptr à la nouvelle taille size.

Allocation dynamique de mémoire

Lors de la programmation, si vous connaissez la taille d'un tableau, c'est simple : vous pouvez le définir comme un tableau. Par exemple, pour stocker un nom de personne, qui peut aller jusqu'à 100 caractères maximum, vous pouvez définir :

char nom[100];

Mais considérons une situation où vous n'avez aucune idée de la longueur du texte à stocker, par exemple une description détaillée. Ici, on définit un pointeur sur caractère sans spécifier la taille, puis on alloue la mémoire selon les besoins :

Démonstration en direct
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
  char nom[100];
  char *description;
  strcpy(nom, "Zara Ali");
  /* allouer la mémoire dynamiquement */
  description = malloc(200 * sizeof(char));
  if (description == NULL) {
    fprintf(stderr, "Erreur - impossible d'allouer la mémoire requise\n");
  } else {
    strcpy(description, "Zara Ali, élève de DPS en classe de 10e");
  }
  printf("Nom = %s\n", nom);
  printf("Description : %s\n", description);
}

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant :

Nom = Zara Ali
Description : Zara Ali, élève de DPS en classe de 10e

Le même programme peut être écrit avec calloc() ; il suffit de remplacer malloc par calloc comme suit :

calloc(200, sizeof(char));

Vous avez ainsi un contrôle total et pouvez passer n'importe quelle taille lors de l'allocation, contrairement aux tableaux où la taille une fois définie ne peut plus changer.

Redimensionnement et libération de mémoire

À la fin du programme, le système d'exploitation libère automatiquement toute la mémoire allouée, mais en bonne pratique, quand vous n'avez plus besoin de mémoire, vous devriez la libérer en appelant free().

Alternativement, vous pouvez augmenter ou diminuer la taille d'un bloc de mémoire alloué en appelant realloc(). Reprenons le programme précédent en utilisant realloc() et free() :

Démonstration en direct
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
  char nom[100];
  char *description;
  strcpy(nom, "Zara Ali");
  /* allouer la mémoire dynamiquement */
  description = malloc(30 * sizeof(char));
  if (description == NULL) {
    fprintf(stderr, "Erreur - impossible d'allouer la mémoire requise\n");
  } else {
    strcpy(description, "Zara Ali, élève de DPS.");
  }
  /* supposez qu'on veuille stocker une description plus longue */
  description = realloc(description, 100 * sizeof(char));
  if (description == NULL) {
    fprintf(stderr, "Erreur - impossible d'allouer la mémoire requise\n");
  } else {
    strcat(description, "Elle est en classe de 10e");
  }
  printf("Nom = %s\n", nom);
  printf("Description : %s\n", description);
  /* libérer la mémoire avec free() */
  free(description);
}

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant :

Nom = Zara Ali
Description : Zara Ali, élève de DPS.Elle est en classe de 10e

Vous pouvez tester l'exemple sans réallouer de mémoire supplémentaire : la fonction strcat() échouera faute de mémoire disponible dans description.

Langue C

  1. Comprendre ROM, PROM, EPROM et EEPROM : conception, programmation et identification
  2. Microprocesseurs : l'évolution de l'informatique à programme stocké
  3. Maîtriser la gestion de mémoire en C++ : Utilisation experte de new et delete
  4. Allocation dynamique de mémoire en C : Maîtriser malloc, calloc, realloc et free
  5. Commentaires de documentation Java : Maîtriser Javadoc et types de commentaires
  6. Maîtriser la mémoire dynamique en C++ : Stack vs Heap expliqués
  7. Java 10 : Allouer le tas sur NV-DIMM avec -XX:AllocateHeapAt
  8. Le Manuel Définitif du Management de Maintenance : Guide Pratique pour Leaders
  9. Événements gestion d'actifs 2012 : meilleures conférences, formations et expositions