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?

61
demandé sur johan 2012-12-24 14:53:51

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.

94
répondu Abdul Muheedh 2017-05-23 11:24:18

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!

41
répondu Kerrek SB 2012-12-24 12:36:39

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.

12
répondu Oren 2012-12-24 10:57:57

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);
}
7
répondu Heikki Salokanto 2017-05-23 11:26:05

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.

strdupde retour d' NULL en cas d'échec. Si la mémoire n'est pas alloué, copie échoue strdup return NULL.

0
répondu Bharath Ravindra 2014-08-04 13:18:50