web-dev-qa-db-fra.com

strcpy vs strdup

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?

65
johan

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.

99
Abdul Muheedh

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!

50
Kerrek SB

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.

13
Oren

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);
}
8
Heikki Salokanto

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.

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

0
Bharath Ravindra