Allocation dynamique

Il est possible d'allouer dynamiquement de la mémoire grâce aux fonctions malloc, realloc et calloc.
Lorsque cette mémoire n'est plus utilisée, elle doit être libérée à l'aide de la fonction free.
Ces fonctions sont definies dans la librairie standard libc et leurs déclarations se trouvent dans stdlib.h.

void *malloc(size_t t) renvoie l'adresse d'une zone mémoire de taille t allouée dynamiquement.
void *calloc(size_t n, size_t t) renvoie l'adresse d'une zone mémoire de taille n x t allouée dynamiquement et initialisée à 0.
void *realloc(void * p, size_t t) renvoie l'adresse d'une zone mémoire de taille t allouée dynamiquement et initialisée par recopie du contenu des t octets situés à l'adresse p. Si p vaut NULL, est équivalent à malloc(t).
malloc et calloc renvoient NULL  si la zone mémoire demandée est de taille 0, ou sur une erreur, en particulier s'il n'y a pas assez de mémoire disponible.

void free(void *p) libère la mémoire d'adresse p, à condition qu'elle ait été allouée à l'aide des fonctions malloc, calloc ou realloc.

Le module Pile

Voici une deuxième version du module Pile, ou la taille de la pile est ajustée pour éviter les débordements. Toutefois, pour des raisons de compatibilité, on garde la fonction pile_pleine(void) et la constante TAILLE_PILE.

version 2 : une seule pile, statique, de capacité "infinie"
pile.h pile.c postfixe.c Makefile

Le module Premiers

En C99, il est possible de déclarer dans des fonctions des tableaux dont la taille est donnée par une expression, par exemple en utilisant un des paramètres d'appel de la fonction. Cette possibilité élimine de façon élégante beaucoup de cas d'utilisation de l'allocation dynamique dans les programmes C. Toutefois, si la mémoire utilisée par la fonction doit être persistente, il convient alors d'utiliser les fonctions malloc et free.

Le module premiers illustre ces différents cas (premiers.h, premiers.c, main.c, Makefile).
Ce module utilise l'algorithme du "crible d'Eratosthène" pour calculer les nombres premiers inférieurs ou égaux à une valeur n donnée. Pour cela, on considère un tableau de booléens indicé de 2 à n dont tous les éléments sont initialisés à vrai. Puis on parcourt ce tableau de 2 à n. A chaque fois que l'on rencontre une valeur vrai, l'indice est un nombre premier et on élimine tous ses multiples.

On notera tout particulièrement le fait que la variable contenant l'adresse du tableau alloué devant être une référence, il s'agit d'un pointeur de pointeur (int **).