next up previous contents index
Next: L'organisation d'un processus Up: No Title Previous: Fichiers d'en-tête

Allocation dynamique

     

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 Cgif. 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.



Rene Lalement
Mon Sep 30 18:22:54 MET 1996