Ce mode d'allocation, aussi appelé allocation sur le tas, est présent en Pascal comme en C, mais pas en Fortran 77. Un objet alloué dynamiquement ne résulte pas de la définition du nom qui le désigne, à la différence des objets statiques et automatiques, mais résulte d'un appel à la fonction malloc, nécessairement réalisé à l'intérieur d'une fonction.
On a vu que c'était une des façons d'initialiser un pointeur :
int *ip = malloc(sizeof(int));
La fonction malloc est déclarée dans stdlib.h. Elle prend en argument un nombre d'octets, alloue un bloc de mémoire de cette taille dans le tas, et retourne l'adresse de ce bloc, de type void*. La taille doit toujours être calculée à l'aide de l'opérateur sizeof, qui appliqué à un type, donne la taille en octets des objets de ce type.
Une application importante de l'allocation dynamique est la simulation de tableaux dynamiques. Pour implémenter un << tableau >> de double dont la taille est lue sur l'entrée standard en cours d'exécution, dans une fonction f :
int f() { double *t; int n, i; scanf("%d", &n); t = malloc(n * sizeof(double)); for (i=0; i<n; i++) { scanf("%lf", t[i]); ... } free(t); }
Il faut noter que la variable t, comme toute variable locale,
est allouée automatiquement ; la valeur qui lui est affectée est
l'adresse d'un objet alloué dynamiquement. Soulignons aussi que
t n'est pas un tableau, et qu'il n'y a pas de tableau dynamique
en C. Bien que t ne soit pas
un tableau, la notation t[i] est utilisable pour
accéder aux éléments alloués consécutivement.
Enfin, quand un objet alloué dynamiquement n'est plus utile, le programme doit comporter une dés-allocation explicite, au moyen de la fonction free, également déclarée dans stdlib.h, à laquelle doit être passée l'adresse de l'objet à dés-allouer. C'est le rôle du free(t) dans la fonction précédente.