strcpy vs strdup
J'ai lu que strcpy
est pour copier une chaîne de caractères, et strdup
retourne un pointeur vers une nouvelle corde à double de la chaîne.
Pourriez-vous nous expliquer ce cas, préférez-vous utiliser strcpy
et ce cas, préférez-vous utiliser strdup
?
Vous devez vous connecter pour publier un commentaire.
strcpy(ptr2, ptr1)
est équivalent àwhile(*ptr2++ = *ptr1++)
où, comme strdup est équivalent à
(memcpy version pourrait être plus efficace)
Donc, si vous voulez la chaîne à laquelle vous avez copié à être utilisé dans une autre fonction (comme il est créé dans le tas de l'article), vous pouvez utiliser strdup, d'autre strcpy est assez.
strdup()
ed chaîne peut s'étendre au-delà de la fin de la fonction en cours, mais cela pourrait être le cas de toute façon (si la cible destrcpy()
est un appelant a fourni un tampon, une variable globale, ou même manuellement alloués à l'aide demalloc()
ounew
).while(*ptr2++ = *ptr1++)
! 🙂Les fonctions
strcpy
etstrncpy
font partie de la bibliothèque standard C et fonctionner dans la mémoire existante. C'est, vous doit fournir de la mémoire dans laquelle les fonctions copier les données de la chaîne, et comme corollaire, vous devez avoir votre propre moyen de trouver la quantité de mémoire dont vous avez besoin.Par contraste,
strdup
est une fonction Posix, et il effectue l'allocation dynamique de la mémoire pour vous. Elle renvoie un pointeur vers nouvellement alloué de la mémoire dans lequel il a copié la chaîne. Mais vous sont maintenant responsables de ce mémoire et doivent finalementfree
il.Qui fait
strdup
l'un des "cachémalloc
" les fonctions de confort, et c'est sans doute 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 unfree
pour chaquemalloc
/calloc
. Mais les fonctions telles questrdup
introduire un cachémalloc
, et vous devez le traiter de la même comme unmalloc
aux fins de la gestion de la mémoire. (Un autre caché des fonctions d'allocation est de GCCabi::__cxa_demangle()
.) Méfiez-vous!strdup
alloue de la mémoire pour la nouvelle chaîne sur le tas, tout en utilisantstrcpy
(ou plus sûrstrncpy
variante), je peux copier une chaîne de caractères dans un pré de la mémoire allouée sur soit le tas ou de la pile.strcpy
à copier dans un tampon statique?Dans le accepté de répondre à, la mise en œuvre de
strdup
est présenté comme:Cependant, qui est un peu sous-optimale car les deux
strlen
etstrcpy
besoin de trouver la longueur de la chaîne en vérifiant si chaque personnage est une\0
.À l'aide de
memcpy
devrait être plus efficace:strcpy
à mettre en œuvrestrdup
de l'aspect pratique de le faire d'une manière efficace.while ( len-- ) { *ptr2++ = *ptr1++ }
, qui à chaque fois fait une soustraction, d'une cession, et de tester pour le zéro, et ensuite a toujours pour exécuter une tâche et de deux postes d'échelon et de leurs missions, de toute façon. Donc, ce memcpy technique semble de moins en moins efficace. Ces sembler trivial distinctions et de l'imaginaire des optimisations.char *strdup(char *pszSrch)
;strdup
va allouer du stockage de la taille de la chaîne d'origine. Si l'allocation de stockage est couronnée de succès, la chaîne d'origine est copié à la copie de la chaîne.strdup
de retour d'NULL
en cas d'échec. Si la mémoire n'est pas alloué, copie échouestrdup
retourNULL
.