320 votes

StrDup() - que faut-il faire en C ?

Quel est le but de la `` fonction en C ?

395voto

paxdiablo Points 341644

Exactement ce que cela ressemble (en supposant que vous êtes habitué à la manière abrégée dans laquelle C et UNIX attribue des mots), il duplique les cordes.

En gardant à l'esprit qu'il ne l'est pas réellement partie de l'ISO C norme elle-même (c'est une POSIX chose), c'est en fait le même 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 string
}

En d'autres termes:

  1. Elle tente d'allouer assez de mémoire pour contenir l'ancienne chaîne (plus un caractère null pour marquer la fin de la chaîne).
  2. Si l'allocation a échoué, il définit errno de ENOMEM et retours NULL immédiatement (réglage de l' errno de ENOMEM est quelque chose d' malloc fait nous n'avons pas besoin explicitement de le faire dans notre strdup).
  3. Sinon la répartition travaillé si on copie l'ancienne chaîne de la nouvelle chaîne et de retour à la nouvelle adresse (l'appelant est responsable de la libération à un certain point).

Gardez à l'esprit que c'est la définition conceptuelle. Toute la bibliothèque de l'écrivain valeur de leur salaire peut avoir fourni fortement optimisé ciblage par code du processeur particulier être utilisés.

Si vous faites partie de la foule qui abhorre plusieurs points de sortie dans les fonctions (je n'en ai pas moins qu'il affecte la lisibilité, je ne crois pas être le cas pour une fonction courte), vous pouvez écrire le code comme:

char *strdup (const char *s) {
    char *d = malloc (strlen (s) + 1);   // Allocate memory
    if (d != NULL) strcpy (d,s);         // Copy string if okay
    return d;                            // Return new memory
}

88voto

tristopia Points 5074
<pre><code></code><p>Peut être un peu plus rapide qu’avec strcpy comme le \0 char n’a pas besoin d’être fouillé à nouveau (il était déjà avec strlen).</p></pre>

53voto

Chris Young Points 8525

Aucun point en répétant l’autre répond, mais s’il vous plaît noter que strdup() peut faire n’importe quoi il veut d’un point de vue C, puisqu’il ne fait pas partie de toute norme de C. Il est toutefois défini par POSIX. 1-2001.

18voto

VonC Points 414372

Strdup homme:

Le fonction doit retourner un pointeur vers une nouvelle chaîne, qui est un doublon de la chaîne pointée par . Le pointeur retourné peut être passé à `` . Un pointeur null est retourné si la nouvelle chaîne ne peut pas être créée.

3voto

jussij Points 7391

Il fait une copie de la chaîne passée en exécutant un malloc et strcpy de la chaîne passée. Le tampon de malloc'ed est retourné à l’appelant, d'où la nécessité de courir librement sur la valeur de retour.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X