HOWTO · C
Utilisez la fonction strdup en C
Découvrez comment strdup duplique une chaîne en C, comment vérifier et libérer la copie allouée, et quand utiliser strndup ou strdupa de GNU.
Sur cette page
strdup crée une copie terminée par un octet nul d’une chaîne C et renvoie une zone mémoire allouée séparément. Vérifiez le pointeur renvoyé avant de l’utiliser, puis libérez la copie obtenue avec free. Utilisez strndup pour limiter le nombre d’octets copiés ; strdupa est une alternative propre à GNU, dont la durée de vie diffère.
Rôle de strdup et disponibilité
La déclaration de strdup est char *strdup(const char *s); et se trouve dans <string.h>. La fonction copie les octets de la chaîne terminée par un octet nul s, y compris cet octet final, dans une nouvelle zone mémoire allouée. Le pointeur renvoyé désigne cette zone ; en cas d’échec de l’allocation, la fonction renvoie NULL.
strdup ne fait pas partie de la bibliothèque standard du C. La fonction est spécifiée par POSIX et fournie par des bibliothèques C courantes, comme la bibliothèque C GNU. Selon la plateforme, une macro de test de fonctionnalités peut être nécessaire pour rendre la déclaration accessible en mode de compilation strict. Consultez la documentation de la plateforme cible si vous devez assurer la portabilité au-delà des systèmes POSIX.
Dupliquer une chaîne avec strdup
Définissez _POSIX_C_SOURCE avant d’inclure les en-têtes si la plateforme l’exige pour rendre accessible la déclaration POSIX. L’exemple vérifie le résultat avant de le lire, puis libère la copie après utilisation. Lors de l’exécution réussie, il affiche la chaîne source et sa copie.
Exécutez cet exemple :
#define _POSIX_C_SOURCE 200809L
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
const char *source = "C strings";
char *copy = strdup(source);
if (copy == NULL) {
puts("Could not duplicate the string.");
return EXIT_FAILURE;
}
printf("Source: %s\nCopy: %s\n", source, copy);
free(copy);
return 0;
}
Source: C strings
Copy: C strings
Si strdup renvoie NULL, ne transmettez pas ce pointeur à des fonctions de traitement des chaînes et n’appelez pas free sur celui-ci. La branche d’échec ci-dessus signale le problème et termine proprement le programme. Lorsque la copie n’est plus nécessaire, appelez free une seule fois ; libérer le littéral source ou utiliser la copie après l’avoir libérée est incorrect.
Copier au plus n octets avec strndup
strndup est également spécifiée par POSIX et déclarée dans <string.h>. Sa déclaration est char *strndup(const char *s, size_t n);. Elle copie au plus n octets de s et ajoute toujours un octet nul final au résultat alloué. La limite porte sur les octets, et non sur les caractères : si elle tombe au milieu de l’encodage d’un caractère multioctet, celui-ci peut être tronqué.
Par exemple, strndup("C strings", 3) produit la chaîne "C s". La zone mémoire renvoyée est allouée dynamiquement : vérifiez donc que le résultat n’est pas NULL et libérez-le avec free en cas de succès, comme avec strdup. La limite détermine la quantité copiée, pas la durée de vie ni la propriété du résultat.
Comprendre l’alternative strdupa, propre à GNU
strdupa est une extension de la bibliothèque C GNU, et non une fonction POSIX ou du C standard. Si nécessaire, définissez _GNU_SOURCE avant les en-têtes système pour rendre sa déclaration accessible. Comme strdup, cette fonction prend une chaîne terminée par un octet nul et en crée une copie, mais utilise un espace de stockage automatique associé à la fonction en cours plutôt qu’une allocation sur le tas.
Cet espace de stockage n’existe que pendant l’exécution de la fonction qui le contient. Ne renvoyez pas le pointeur pour l’utiliser après la fin de cette fonction et ne le transmettez pas à free. Sa disponibilité et son implémentation dépendent de l’environnement GNU ; utilisez donc strdup si vous avez besoin d’une interface POSIX ou d’une copie dont vous pouvez contrôler la durée de vie avec free. Aucun exemple exécutable de strdupa n’est présenté ici, car cette fonction est propre aux environnements GNU.