next up previous contents index
Next: Représentation des matrices par Up: No Title Previous: Hachage par chaînage

Tableau résultat d'une fonction et allocation dynamique

 

On a vu qu'une fonction ne pouvait pas retourner un tableau (le type de retour d'une fonction ne peut être qu'un type simple, un type pointeur ou un struct). Pour contourner cette difficulté, on pourrait être tenté de retourner l'adresse d'un tableau défini localement dans la fonction :

double *vecteur_add_faux(double x[], double y[]) {
  double z[3];
  int i;
  for(i=0; i<3; i++) {
    z[i] = x[i] + y[i];
  }
  return z;
}

Cette définition est incorrecte, car l'allocation du tableau z étant automatique, le bloc alloué est aussi dés-alloué à la sortie de la fonction, donc la valeur retournée est l'adresse d'un bloc mémoire qui n'est plus alloué. Le résultat est alors imprévisible.

   

Si une fonction doit avoir comme résultat un tableau, on doit soit utiliser un tableau alloué avant l'appel et le passer en argument, soit recourir à l'allocation dynamique à l'intérieur de la fonction pour allouer un bloc de mémoire où le résultat sera écrit ; la fonction retourne dans ce cas l'adresse du tableau alloué. On procède ainsi :

double *vecteur_add(double x[], double y[]) {
  int i;
  double *z = (double *)malloc(3*sizeof(double));
  for(i=0; i<3; i++) {
    z[i] = x[i] + y[i];
  }
  return z;
}

et on l'appelle ainsi :

  double x[] = {1.0, 2.0, 3.0};
  double y[] = {4.0, 5.0, 6.0};
  double *z = vecteur_add(x,y);

Quand le tableau alloué ne sera plus utile, il faudra le dés-allouer par un appel à free(z).



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