Exercice
Soit le programme suivant :
char *fonctTableau(){
char T[]="123456789";
return T;
}
int main(){
char *ptc=fonctTableau();
char c0=ptc[0];
char c1=ptc[1];
printf("c0=%c c1=%c\n", c0, c1);
c0=ptc[2];
c1=ptc[3];
printf("c0=%c c1=%c\n", c0, c1);
return 0;
}
char *fonctTableau(){ char T[]="123456789"; return T; } int main(){ char *ptc=fonctTableau(); char c0=ptc[0]; char c1=ptc[1]; printf("c0=%c c1=%c\n", c0, c1); c0=ptc[2]; c1=ptc[3]; printf("c0=%c c1=%c\n", c0, c1); return 0; }
À l'exécution, nous obtenons l'affichage suivant :
c0=1 c1=2
c0= c1=Û
Pourquoi ?
Votre choixChoix attenduRéponse
Le retour d'une adresse d'une variable locale est déconseillé, car c'est une adresse « valide » d'une zone au contenu indéterminé après exécution de la foncTableau. Le compilateur a relevé ce problème en affichant un message d'avertissement (warning).
Selon l'objectif de ce retour d'adresse, plusieurs solutions sont possibles :
Modifier la catégorie de la variable T par le qualificatif static. La variable devient permanente. C'est le même exemplaire pour tous les appels de la fonction.
Utiliser l'allocation dynamique pour définir le tableau de caractères (voir un chapitre ultérieur),
Ajouter un paramètre pour obtenir une adresse de caractères qui sera utilisée pour stocker la suite de caractères définie dans la fonction. Le prototype de la fonction est modifié,
Utiliser une imbrication dans une structure pour retourner le contenu complet du tableau. On modifie alors le type de retour de la fonction foncTableau.
Attention ! Copier le contenu du tableau dès réception de l'adresse de retour n'est pas une solution satisfaisante, car la boucle ou la fonction utilisée pour cette copie peut écraser le contenu de la variable tableau automatique.