Fonction strdup

Fermé
tiktak - 19 sept. 2013 à 18:44
[Dal] Messages postés 6193 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 4 juillet 2024 - 14 oct. 2013 à 10:50
Bonjour,



je dois reproduire la fonction strdup, de ce que j ai compris elle retourne l'adresse d'un tableau de caractéres alloué dynamiquement contenant une copie de la chaine passée en paramètre.

Je pense que ca donne ca ? Si quelqu un peut me confirmer, et si ce n est pas bon m expliquer ce que j ai ;al fais, merci d avance.

char *ft_strdup(char *src)
{
char *k = NULL;
if (src != NULL)
{
k = malloc((src + 1) * sizeof *k);
}
}

2 réponses

[Dal] Messages postés 6193 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 4 juillet 2024 1 089
20 sept. 2013 à 11:47
Salut tiktak,

elle retourne

ta fonction ne retourne rien, en dépit de son prototype, car elle ne contient pas de "return".

l'adresse d'un tableau de caractéres alloué dynamiquement

la taille que tu passes à malloc est erronée : tu dois allouer un nombre d'octets égal au nombre de caractères de la chaîne, y compris le caractère de fin '\0'. "src" est un pointeur sur char, pas autre chose.

contenant une copie de la chaine passée en paramètre

tu ne fais aucune copie de la chaîne passée en paramètre dans l'espace nouvellement alloué.


Dal
1
[Dal] Messages postés 6193 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 4 juillet 2024 1 089
20 sept. 2013 à 13:46
Subsidiairement, il faudrait aussi vérifier si l'allocation de k a réussit.
0
char *ft_strdup(char *src)
{
int i;
int j;
char *dest;

i = 0;
j = 0;
dest = malloc(sizeof (*dest) * (1 + strlen(src)));
if (dest == NULL)
return (0);
while (src[i] = dest[j])
{
i++;
j++;
}
dest[j] = '\0';
return (dest);
}
0
[Dal] Messages postés 6193 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 4 juillet 2024 1 089
Modifié par [Dal] le 14/10/2013 à 11:18
Salut Oumnia,

Alors, la référence devrait donc être la fonction strdup POSIX.

dest = malloc(sizeof(*dest) * (1 + strlen(src)));

sizeof(*dest)
n'a pas trop de sens. Cela va donner 1 systématiquement, car tu cherches la taille de pointeur sur char déréférencé (donc d'un char). Comme dest n'est pas alloué à ce stade, c'est encore plus bizarre (même si ce n'est pas fondamentalement incorrect).

Ce sizeof suivit de
*
est inutile, puisque tu multiplies systématiquement 1 par ce qui suit.

(1 + strlen(src))
est déjà mieux. Comme
strlen
est définie dans
string.h
, il faudra l'inclure (je ne suis pas sûr que tu puisses faire cela, puisque POSIX définit strdup dans ce même entête... mais c'est toi qui vois).

return (0);
selon la référence, tu dois renvoyer NULL, donc renvoie NULL. Pas de parenthèses nécessaires, return étant une instruction du langage C, et pas une fonction (pareil pour le return final).

while (src[i] = dest[j])
comme tu utilises l'opérateur "=" et non "==", tu affectes la valeur de dest[j] à src[i], c'est à dire l'inverse de ce que tu dois faire. L'usage de deux variables est superflu, puisqu'elles s'incrémentent ensemble.
while
est sensé contenir une expression évaluée avant le contenu de la boucle. Là, ta sortie de boucle dépend de dest[j], dont le contenu est imprévisible, puisqu'il pointe vers une zone mémoire allouée, mais non initialisée.

Enfin, à condition que tu affectes dans le bon sens dans le while,
dest[j] = '\0'; 
est superflu, puisque while est déjà évalué à 0 pour permettre la sortie de boucle.

Cela dit, l'usage d'un opérateur d'affectation dans la condition du
while
est une pratique trompeuse, qui devrait être évitée. Tu peux (et devrais sûrement) faire autrement.


Dal
0