next up previous contents index
Next: L'organisation d'un processus Up: No Title Previous: Allocation dynamique

Ré-allocation dynamique

  

Il arrive que la taille des données, non seulement ne soit pas connue à la compilation, ce qui fait qu'elles doivent être placées dans le tas, mais même ne soit pas connue à l'exécution : c'est le cas si le programme doit stocker des données saisies interactivement mais ne demande pas à l'utilisateur combien de données seront saisies. On procède alors à une première allocation par malloc, et on appelle la fonction realloc pour obtenir une nouvelle allocation avant que la donnée suivante ne soit saisie ; la fin de la lecture est signalée par une valeur négative ou nulle retournée par scanf :

 

double *lire_donnees(int *n) {
  double *t = NULL;
  double x;
  int lus = 0;

  *n = 0;
  do {
    lus = scanf("%lf", &x);
    if (lus>0) {
      (*n)++;
      if (t==NULL) {
        t = malloc(sizeof(double));
      } else {
        t = realloc(t, (*n)*sizeof(double));
      }
      t[(*n)-1] = x;
    }
  } while (lus > 0);
  return t;
}

Un appel lire_donnees(&m) retourne l'adresse du bloc dynamique contenant les données saisies, et écrit dans la variable m leur nombre. L'incrémentation du nombre de doubles saisis se fait par l'expression (*n)++ ; notons que les parenthèses autour de *n sont indispensables (d'après les précédences relatives de * et ++, l'expression *n++ est analysée comme *(n++)).


  
Figure 20: Ré-allocation
\begin{figure}
 \begin{center}
 \leavevmode
 
\fbox {
 \epsfig{file=fig/realloc.eps}
 }
 \end{center} \end{figure}

L'effet de realloc(t,m) est d'allouer un bloc de taille m, de recopier éventuellement le contenu du bloc précédemment à l'adresse t dans ce nouveau bloc, et de retourner l'adresse du nouveau bloc. La figure 20 montre le cas où le bloc ne pouvant pas être agrandi, un nouveau bloc doit être créé, le contenu de l'ancien recopié et la valeur de t modifiée ; la valeur de t n'est pas modifiée et il n'y a pas de recopie quand il y a assez d'espace adjacent au bloc pour l'agrandir.


next up previous contents index
Next: L'organisation d'un processus Up: No Title Previous: Allocation dynamique
Jean-Philippe Chancelier
9/29/1998