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 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) est équivalent à while(*ptr2++ = *ptr1++)

    où comme strdup est équivalent à

     ptr2 = malloc(strlen(ptr1)+1); strcpy(ptr2,ptr1); 

    (la version de 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 (comme elle est créée dans la section heap), vous pouvez utiliser strdup, sinon strcpy est suffisant.

    Les fonctions strcpy et strncpy font partie de la bibliothèque standard C et fonctionnent sur la mémoire existante. En d’autres termes, vous devez fournir la mémoire dans laquelle les fonctions copient les données de chaîne et, corollairement, vous devez disposer de vos propres moyens pour déterminer la quantité de mémoire dont vous avez besoin.

    En strdup , strdup est une fonction Posix, qui effectue une allocation dynamic de la mémoire 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 la free .

    Cela fait de strdup une des fonctions de commodité “cachées de malloc “, et c’est probablement pour cette raison qu’il ne fait pas partie de la bibliothèque standard. Tant que vous utilisez la bibliothèque standard, vous savez que vous devez en appeler une free pour chaque malloc / calloc . Mais des fonctions telles que strdup introduisent un malloc caché, et vous devez le traiter comme un malloc pour la gestion de la mémoire. (Une autre fonction d’allocation de ce type est abi::__cxa_demangle() .) Attention!

    strdup alloue de la mémoire pour la nouvelle chaîne sur le tas, tout en utilisant strcpy (ou sa strncpy strncpy plus sûre), je peux copier une chaîne dans une mémoire pré-allouée sur le tas ou la stack.

    Dans la réponse acceptée , la mise en œuvre de strdup est présentée comme strdup :

     ptr2 = malloc(strlen(ptr1)+1); strcpy(ptr2,ptr1); 

    Cependant, cela est quelque peu sous-optimal car strlen et strcpy doivent 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 à 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 retourne NULL en cas d’échec. Si la mémoire n’est pas allouée, la copie échoue strdup return NULL .