strcpy vs strdup
J'ai lu que strcpy
est pour copier une chaîne, et strdup
renvoie un pointeur sur une nouvelle chaîne pour dupliquer la chaîne.
Pourriez-vous nous expliquer ce cas, préférez-vous utiliser strcpy
et ce cas, préférez-vous utiliser strdup
?
5 réponses
strcpy(ptr2, ptr1)
est équivalent à while(*ptr2++ = *ptr1++)
Où as strdup est équivalent à
ptr2 = malloc(strlen(ptr1)+1);
strcpy(ptr2,ptr1);
(memcpy version peut être plus efficace)
Donc, si vous voulez que la chaîne que vous avez copiée soit utilisée dans une autre fonction (telle qu'elle est créée dans la section tas), vous pouvez utiliser strdup, sinon strcpy est suffisant.
Les fonctions strcpy
et strncpy
font partie de la bibliothèque standard C et fonctionner dans la mémoire existante. Autrement dit, Vous devez fournir la mémoire dans laquelle les fonctions copient les données de chaîne, et en corollaire, Vous devez avoir vos propres moyens de trouver la quantité de mémoire dont vous avez besoin.
Par constrast, strdup
est une fonction Posix, et elle effectue une allocation de mémoire dynamique pour vous. Il renvoie un pointeur vers 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 free
elle.
Cela fait de strdup
l'une des fonctions de commodité "hidden malloc
", et c'est probablement aussi 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
à des fins de gestion de la mémoire. (Un autre tel caché les fonctions d'allocation sont celles de GCC abi::__cxa_demangle()
.) Méfiez-vous!
strdup
alloue de la mémoire pour la nouvelle chaîne sur le tas, tout en utilisant strcpy
(ou son plus sûr strncpy
variable) je peux copier une chaîne dans une mémoire pré-allouée sur soit le tas ou la pile.
Dans la réponse acceptée , la mise en œuvre de strdup
est présentée comme:
ptr2 = malloc(strlen(ptr1)+1);
strcpy(ptr2,ptr1);
Cependant, c'est un peu sous-optimal car strlen
et strcpy
doivent tous deux 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 le stockage de la taille de la chaîne d'origine. Si l'allocation de stockage est réussie, la chaîne d'origine est copiée dans la chaîne dupliquée.
strdup
de retour d' NULL
en cas d'échec. Si la mémoire n'est pas alloué, copie échoue strdup
return NULL
.