13.4. Application des pointeurs : allocation dynamique malloc, free

Icône de l'outil pédagogique Introduction

Nous n'abordons ici que les principes de l'allocation dynamique et son application aux tableaux à une dimension. Pour les tableaux à deux dimensions (matrices), nettement plus délicats à créer dynamiquement, il existe un document spécifique (voir A. Priou).

Nous avons vu qu'il existe :

– des variables statiques, occupant un emplacement mémoire déterminé à la compilation (exemple : variable locale static et variable globale) ;

– des variables automatiques, créées en pile et détruites au fur et à mesure de l'exécution des fonctions où elles sont définies (exemple : variable locale « normale »).

Il existe un troisième type de variables : les variables dynamiques, dont la création et la destruction dépendent de demandes explicites faites par le programme au cours de l'exécution. Elles sont situées dans une zone de la mémoire appelée le tas (heap).

Sur un PC, la mémoire (RAM) est utilisée pour stocker le code, les données statiques, la pile et le tas (données dynamiques). Les tailles que peuvent occuper ces quatre « familles d'informations » dépendent du modèle mémoire utilisé par le compilateur (on peut le modifier, sur un PC, à l'aide du menu Options de votre IDE). Par exemple, dans le modèle Medium, les données statiques, la pile et le tas se partagent un segment de 64 Ko, alors que le code peut s'étendre jusqu'à un Mo. Si on veut manipuler un volume de données important, ce n'est pas ce modèle qu'il faut choisir.

Le principal intérêt des variables dynamiques est de définir de « grosses » structures de données dont la taille ou le nombre ne sont connus qu'à l'exécution : par exemple, tableaux de dimensions variables, listes chaînées.

La gestion dynamique de données nécessite deux étapes :

– l'allocation de la mémoire, réalisée par la fonction malloc ;

– la libération de la mémoire, réalisée par la fonction free ; elle permettra de réutiliser la mémoire pour créer d'autres variables dynamiques.

Les prototypes des fonctions de gestion dynamique de la mémoire se trouvent dans le fichier en‐tête stdlib.h de la bibliothèque standard du C.