J'ai lu que strcpy
est destiné à la copie d'une chaîne, et strdup
renvoie un pointeur sur une nouvelle chaîne pour dupliquer la chaîne.
Pourriez-vous s'il vous plaît expliquer quels cas préférez-vous utiliser strcpy
et quels cas préférez-vous utiliser strdup
?
strcpy(ptr2, ptr1)
équivaut à while(*ptr2++ = *ptr1++)
où comme strdup est équivalent à
ptr2 = malloc(strlen(ptr1)+1);
strcpy(ptr2,ptr1);
( version memcpy pourrait être plus efficace)
Donc, si vous voulez que la chaîne que vous avez copiée soit utilisée dans une autre fonction (telle que créée dans la section heap), vous pouvez utiliser strdup, sinon strcpy suffit.
Les fonctions strcpy
et strncpy
font partie de la bibliothèque standard C et fonctionnent sur la mémoire existante. C’est-à-dire que vous devez fournir la mémoire dans laquelle les fonctions copient les données de chaîne et, corollairement, vous devez disposer de votre propre moyen de déterminer la quantité de mémoire dont vous avez besoin. .
Par contraste, strdup
est une fonction Posix, qui effectue une allocation de mémoire dynamique pour vous. Il renvoie un pointeur sur la mémoire nouvellement allouée dans laquelle il a copié la chaîne. Mais vous êtes maintenant responsable de cette mémoire et devez éventuellement le free
le.
Cela fait de strdup
l'une des fonctions pratiques "cachées malloc
", ce qui explique sans doute également pourquoi il ne fait pas partie de la bibliothèque standard. Tant que vous utilisez la bibliothèque standard, vous savez que vous devez appeler un free
pour chaque malloc
/calloc
. Mais des fonctions telles que strdup
introduisent un malloc
caché, et vous devez le traiter de la même manière qu'un malloc
aux fins de la gestion de la mémoire. (Une autre fonction d'allocation cachée est la abi::__cxa_demangle()
de GCC). Attention!
strdup
alloue de la mémoire pour la nouvelle chaîne sur le tas, en utilisant strcpy
(ou sa méthode plus sûre strncpy
variante), je peux copier une chaîne dans une mémoire préallouée sur soit le tas ou la pile.
Dans le réponse acceptée , l'implémentation de strdup
est présentée comme suit:
ptr2 = malloc(strlen(ptr1)+1);
strcpy(ptr2,ptr1);
Cependant, c'est quelque peu sous-optimal car strlen
et strcpy
ont besoin de trouver la longueur de la chaîne en vérifiant si chaque caractère est un \0
.
Utiliser memcpy
devrait être plus efficace:
char *strdup(const char *src) {
size_t len = strlen(src) + 1;
char *s = malloc(len);
if (s == NULL)
return NULL;
return (char *)memcpy(s, src, len);
}
char *strdup(char *pszSrch)
;
strdup
allouera à la mémoire la taille de la chaîne d'origine. Si l'allocation de stockage réussit, la chaîne d'origine est copiée dans la chaîne en double.
strdup
d renvoie NULL
en cas d'échec. Si la mémoire n'est pas allouée, la copie échoue strdup
return NULL
.