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
[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
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
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
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
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);
}
{
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);
}
[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
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)));
Ce sizeof suivit de
Enfin, à condition que tu affectes dans le bon sens dans le while,
Cela dit, l'usage d'un opérateur d'affectation dans la condition du
Dal
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
strlenest 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.
whileest 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
whileest une pratique trompeuse, qui devrait être évitée. Tu peux (et devrais sûrement) faire autrement.
Dal
20 sept. 2013 à 13:46