Aller au contenu

Annexe A — Gestion de la mémoire

Le modèle mémoire en C

Un programme C dispose de plusieurs zones mémoire :

Zone Contenu Durée de vie
Code (Text) Instructions machine Toute l'exécution
Data Variables globales/statiques initialisées Toute l'exécution
BSS Variables globales/statiques non initialisées Toute l'exécution
Stack (Pile) Variables locales, arguments, adresses de retour Durée de la fonction
Heap (Tas) Allocations dynamiques (malloc, calloc) Jusqu'à free()

Fonctions d'allocation

#include <stdlib.h>

// Alloue n octets (non initialisés)
void *malloc(size_t n);

// Alloue et initialise à zéro
void *calloc(size_t count, size_t size);

// Redimensionne un bloc existant
void *realloc(void *ptr, size_t new_size);

// Libère la mémoire
void free(void *ptr);

Erreurs courantes

Fuite mémoire (Memory Leak)

void fuite(void) {
    int *p = malloc(sizeof(int) * 100);
    // oubli de free(p) → fuite mémoire
}

Utilisation après libération (Use After Free)

int *p = malloc(sizeof(int));
*p = 42;
free(p);
printf("%d\n", *p); // comportement indéfini !

Double libération (Double Free)

int *p = malloc(sizeof(int));
free(p);
free(p); // crash ou corruption !

Détecter les fuites avec Valgrind

gcc -g -o prog mon_programme.c
valgrind --leak-check=full ./prog

Bonnes pratiques

  • Toujours vérifier que malloc ne retourne pas NULL
  • Mettre le pointeur à NULL après free
  • Utiliser sizeof(type) plutôt que des tailles codées en dur
  • Préférer calloc pour les tableaux (initialise à zéro)