Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Une chaîne en valeur de retour

3 réponses
Avatar
Noé Falzon
Bonjour,

J'ai une fonction qui est sencée retourner une chaîne de caractères.
Mais je me suis rendu compte assez vite que ça ne fonctionnait pas,
voire même que "retourner" une chaîne ne signifiait as grand chose,
puisque mon tableau de char est une variable interne à ma fonction, et
que donc retourner le pointeur qui pointe sur le premier élément est
inutile, étant donné que mon tableau disparait quand la fonction se
termine.

J'ai essayé de trouver des solutions, et je n'en vois qu'une qui parait
être correcte, mais je voulais demander un avis avant de l'implémenter :

Il s'agirait, dans la fonction, de définir la chaîne non pas comme une
variable, mais de façon dynamique avec malloc. Ainsi, retourner un
pointeur vers ce tableau serait possible (et surtout utilisable).

Je ne sais pas trop ce que ça vaut, ou si il y a mieux.
Qu'en pensez vous ?

Merci d'avance,
Noé F.
--
"Je ne deteste que les bourreaux" -- Albert Camus

Pour m'écrire un mail, veuillez retirer PASDEPUB de mon adresse ;)

3 réponses

Avatar
Pierre Maurette
Noé Falzon a écrit:

Bonjour,

J'ai une fonction qui est sencée retourner une chaîne de caractères.
Mais je me suis rendu compte assez vite que ça ne fonctionnait pas,
voire même que "retourner" une chaîne ne signifiait as grand chose,
puisque mon tableau de char est une variable interne à ma fonction, et
que donc retourner le pointeur qui pointe sur le premier élément est
inutile, étant donné que mon tableau disparait quand la fonction se
termine.

J'ai essayé de trouver des solutions, et je n'en vois qu'une qui parait
être correcte, mais je voulais demander un avis avant de l'implémenter :

Il s'agirait, dans la fonction, de définir la chaîne non pas comme une
variable, mais de façon dynamique avec malloc. Ainsi, retourner un
pointeur vers ce tableau serait possible (et surtout utilisable).

Je ne sais pas trop ce que ça vaut, ou si il y a mieux.
Qu'en pensez vous ?
Pas de raison que ça ne fonctionne pas. Il suffit d'être attentif au

fait que pour libérer le malloc(), il faut garder la valeur du
pointeur retourné. Donc pas de:
printf("%s", machaine(argumets));

Ou alors:
char* tempo;
printf("%s", tempo = machaine(argumets));
free(tempo);
--
Pierre

Avatar
Marc Boyer
Noé Falzon wrote:
J'ai une fonction qui est sencée retourner une chaîne de caractères.
Mais je me suis rendu compte assez vite que ça ne fonctionnait pas,
voire même que "retourner" une chaîne ne signifiait as grand chose,
puisque mon tableau de char est une variable interne à ma fonction, et
que donc retourner le pointeur qui pointe sur le premier élément est
inutile, étant donné que mon tableau disparait quand la fonction se
termine.


Oui.

J'ai essayé de trouver des solutions, et je n'en vois qu'une qui parait
être correcte, mais je voulais demander un avis avant de l'implémenter :

Il s'agirait, dans la fonction, de définir la chaîne non pas comme une
variable, mais de façon dynamique avec malloc. Ainsi, retourner un
pointeur vers ce tableau serait possible (et surtout utilisable).

Je ne sais pas trop ce que ça vaut, ou si il y a mieux.
Qu'en pensez vous ?


En général, on évite de retourner des choses allouées
dans une fonction par peur que les utilisateurs oublient le
free().
On préfère alors que l'utilisateur fournisse la chaine dans
laquelle on écrit le résultat, et précise sa taille.
Bien sur, si l'utilisateur est incapable de borner la
taille nécessaire, c'est impossible.

Est-ce qu'une méthode est mieux que l'autre ? Ben, ça
dépend du critère...

Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.

Avatar
Emmanuel Delahaye
Noé Falzon wrote on 03/11/04 :
J'ai une fonction qui est sencée retourner une chaîne de caractères.


Censée...

On ne sait pas passer ou retourner un tableau en C. On ne fait que
passer ou retourner son adresse.

Mais je me suis rendu compte assez vite que ça ne fonctionnait pas,
voire même que "retourner" une chaîne ne signifiait as grand chose,


Exact.

puisque mon tableau de char est une variable interne à ma fonction, et
que donc retourner le pointeur qui pointe sur le premier élément est
inutile, étant donné que mon tableau disparait quand la fonction se
termine.


Si tu veux dire "retourner l'adresse", oui effectivement elle doit être
valide après être sortie de la fonction. (L'adresse d'une variable
locale est invalide)

J'ai essayé de trouver des solutions, et je n'en vois qu'une qui parait
être correcte, mais je voulais demander un avis avant de l'implémenter :


Il y en a 3

1 - Passer l'adresse de la chaine en paramètre (fgets() ...) et la
retourner
2 - Allouer la chaine dynamiquement et retourner l'adresse (strdup(),
fonction Posix bien connue)
3 - Retourner l'adresse d'une chaine statique. Utile si elle est
constante, sinon, c'est une source de problèmes (strftime()).

Il s'agirait, dans la fonction, de définir la chaîne non pas comme une
variable, mais de façon dynamique avec malloc. Ainsi, retourner un
pointeur vers ce tableau serait possible (et surtout utilisable).


C'est une bonne méthode (#2). Il faut une syntaxe claire.
Personnellement, j'ajoute '_dyn' en suffixe à la fonction, ça veux dire
"attention, allocation dynamique, libérer le bloc après usage".

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"C is a sharp tool"