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 **).