Ajouter un commentaire

fredericmazue

Quote:
Toutefois, ce qui arrive ici est plus vicieux que ce qui est

expliqué par labofonic.
En effet le paramètre chaine est un pointeur sur une chaine de caractère.

Donc ce qui est passé par valeur, c'est le pointeur, pas la chaine !
Ce qui veut dire que tu peux changer le contenu de la chaine (par un
accès direct avec chaine[i] ou des fonctions comme strcpy(). Avec une limitation de taille (jeu de mot) : attention à la longueur de la chaine à recopier, qui doit être inférieure ou alors à celle d'entrée !

Tout à fait !
Et même plus que cela... on NE PEUT PAS en C écrire une fonction qui
retourne une chaine car

- le type chaine n'existe pas
- char * n'est pas une chaine. L'erreur ultra classique est alors

char *buggy(char *param)
{
  char chaine[256];
  strcpy(chaine, param);
  return chaine; //BANG
}

parce que la prétendue chaine (mais le vrai tableau) est sur la pile et sera détruite à la sortie de la fonction.

Quote:
Toi, tu as changé l'adresse pointée par le pointeur en le dirigeant vers une constante chaine locale à la fonction. Heureusement, le changement était uniquement local (pas dans la variable chaine du main) car sinon la zone pointée par le pointeur retourné pourrait (ça dépendra du compilateur) ne pas être valide.

En plus...
Et comme on ne peut pas compter sur le comportement d'un compilateur le code est pas bon du tout du tout.

Il est important de bien avoir en tête qu'en C le type chaine n'existe pas. donc on ne peut pas le copier, l'affecter, le retourner. Ce qu'on fait quand on travaille avec des "chaine" en C c'est travailler
avec des tableau de char. Comme, jrebillat te l'as dit: "accès direct
avec chaine[i]". Et sa recommandation "attention à la longueur de la
chaine à recopier, qui doit être inférieure ou alors à celle d'entrée !" ne sera sans doute doute jamais trop répétée. Et j'ajoute attention au zéro final de la "chaine" :)

char tableau[2];
strcpy(tableau, "ab"); // BUG!!!!!!!

car on met trois éléments dans un tableau qui ne peut en contenir que 2.
3 avec le zéro final.....

Filtered HTML

Plain text

CAPTCHA
Cette question permet de vérifier que vous n'êtes pas un robot spammeur :-)
 X   X  PPPP       J   CCC  TTTTTT 
X X P P J C TT
X PPPP J C TT
X X P J J C TT
X X P JJJ CCC TT