strdup () – que fait-il dans C?

Quel est le but de la fonction strdup() dans C?

    Exactement ce que cela ressemble, en supposant que vous êtes habitué à la façon abrégée dans laquelle C et UNIX atsortingbuent des mots, cela duplique les chaînes 🙂

    Gardant à l’esprit que cela ne fait pas partie du standard ISO C lui-même (a) (c’est une chose POSIX), il fait effectivement la même chose que le code suivant:

     char *strdup (const char *s) { char *d = malloc (strlen (s) + 1); // Space for length plus nul if (d == NULL) return NULL; // No memory strcpy (d,s); // Copy the characters return d; // Return the new ssortingng } 

    En d’autres termes:

    1. Il essaie d’allouer suffisamment de mémoire pour contenir l’ancienne chaîne (plus un caractère ‘\ 0’ pour marquer la fin de la chaîne).

    2. Si l’allocation a échoué, il définit errno sur ENOMEM et renvoie immédiatement NULL . Définir errno à ENOMEM est quelque chose que malloc fait dans POSIX, nous n’avons donc pas besoin de le faire explicitement dans notre strdup . Si vous n’êtes pas conforme à POSIX, ISO C ne ENOMEM pas l’existence d’ ENOMEM , je ne l’ai donc pas incluse ici (b) .

    3. Autrement, l’allocation a fonctionné, nous copions donc l’ancienne chaîne dans la nouvelle chaîne et renvoyons la nouvelle adresse (à laquelle l’appelant est responsable de la libération à un moment donné).

    Gardez à l’esprit que c’est la définition conceptuelle. Tout auteur de bibliothèque qui mérite son salaire peut avoir fourni un code fortement optimisé ciblant le processeur particulier utilisé.


    (a) Gardez à l’esprit, cependant, que les fonctions commençant par str et une lettre minuscule sont réservées par la norme pour les directions futures. De C11 7.1.3 Reserved identifiers :

    Chaque en-tête déclare ou définit tous les identificateurs énumérés dans sa sous-clause associée, et * déclare ou définit facultativement les identificateurs répertoriés dans la sous-clause relative aux futures directions de bibliothèque associées. **

    Les futures orientations pour ssortingng.h se trouvent dans C11 7.31.13 Ssortingng handling :

    Les noms de fonctions commençant par str , mem ou wcs et une lettre minuscule peuvent être ajoutés aux déclarations dans l’en-tête .


    (b) Le changement remplacerait fondamentalement if (d == NULL) return NULL; avec:

     if (d == NULL) { errno = ENOMEM; return NULL; } 
     char * strdup(const char * s) { size_t len = 1+strlen(s); char *p = malloc(len); return p ? memcpy(p, s, len) : NULL; } 

    Peut-être que le code est un peu plus rapide qu’avec strcpy() car le caractère \0 n’a pas besoin d’être à nouveau recherché (il l’était déjà avec strlen() ).

    strdup() répéter les autres réponses, mais veuillez noter que strdup() peut faire tout ce qu’il veut d’un sharepoint vue C, car il ne fait partie d’aucun standard C. Il est cependant défini par POSIX.1-2001.

    De strdup man :

    La fonction strdup() renverra un pointeur sur une nouvelle chaîne, qui est une copie de la chaîne pointée par s1 . Le pointeur retourné peut être passé à free() . Un pointeur nul est renvoyé si la nouvelle chaîne ne peut pas être créée.

    Il crée une copie de la chaîne transmise en exécutant un malloc et une strcpy de la chaîne transmise. Le tampon malloc’ed est renvoyé à l’appelant, d’où la nécessité de s’exécuter librement sur la valeur de retour.

    strdup () effectue une allocation de mémoire dynamic pour le tableau de caractères, y compris le caractère de fin “\ 0” et renvoie l’adresse de la mémoire de tas:

     char *strdup (const char *s) { char *p = malloc (strlen (s) + 1); // allocate memory if (p != NULL) strcpy (p,s); // copy ssortingng return p; // return the memory } 

    Donc, ce qu’il fait, c’est nous donner une autre chaîne identique à la chaîne donnée par son argument, sans nous obliger à allouer de la mémoire. Mais nous devons encore le libérer plus tard.

    strdup et strndup sont définis dans les systèmes compatibles POSIX comme suit:

     char *strdup(const char *str); char *strndup(const char *str, size_t len); 

    La fonction strdup () alloue suffisamment de mémoire pour une copie de la chaîne str , effectue la copie et lui renvoie un pointeur.

    Le pointeur peut ensuite être utilisé comme argument de la fonction free .

    Si la mémoire disponible est insuffisante, NULL est renvoyé et errno est défini sur ENOMEM .

    La fonction strndup () copie au maximum les caractères len de la chaîne str en mettant toujours à zéro la chaîne copiée.

    La chose la plus précieuse est de vous donner une autre chaîne identique à la première, sans vous obliger à atsortingbuer vous-même de la mémoire (emplacement et taille). Mais, comme indiqué, vous devez toujours le libérer (mais cela ne nécessite pas non plus un calcul de quantité).

    La fonction strdup () est un raccourci pour la duplication de chaîne, elle prend un paramètre comme constante de chaîne ou un littéral de chaîne et alloue juste assez d’espace pour la chaîne et écrit les caractères correspondants dans l’espace alloué et retourne enfin l’adresse du fichier alloué espace à la routine d’appel.

    C’est simple strcpy(ptr2, ptr1) est équivalent à while(*ptr2++ = *ptr1++)

    où comme: strdup est équivalent à

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

    strcpy(ptr2,ptr1);

    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