HOWTO · C
Use a função strdup em C
Saiba como o strdup duplica uma string em C, como verificar e liberar a cópia alocada e quando usar strndup ou o strdupa do GNU.
Nesta página
strdup cria uma cópia de uma string C terminada em nulo e retorna uma área de memória alocada separadamente. Verifique o ponteiro retornado antes de usá-lo e, depois, libere a cópia válida com free. Use strndup quando precisar limitar o número de bytes copiados; strdupa é uma alternativa específica do GNU, com tempo de vida diferente.
O que strdup faz e onde está disponível
A declaração de strdup é char *strdup(const char *s); e fica em <string.h>. A função copia os bytes da string s terminada em nulo, incluindo o byte nulo final, para uma nova área de memória alocada. O ponteiro retornado aponta para essa área; se a alocação falhar, a função retorna NULL.
strdup não faz parte da biblioteca padrão de C. A função é especificada pelo POSIX e está disponível em bibliotecas C comuns, como a biblioteca GNU C. Em alguns sistemas, pode ser necessário definir uma macro de teste de recursos para expor a declaração ao compilar em um modo de linguagem estrito. Consulte a documentação da plataforma de destino quando precisar de portabilidade além de sistemas POSIX.
Duplique uma string com strdup
Defina _POSIX_C_SOURCE antes de incluir os cabeçalhos se a plataforma exigir essa macro para expor a declaração POSIX. O exemplo verifica o resultado antes de lê-lo e libera a cópia depois do uso. Na execução bem-sucedida, ele imprime a string original e sua cópia.
Execute este exemplo:
#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
Se strdup retornar NULL, não passe o ponteiro para funções de string nem chame free com ele. O ramo de falha acima informa o problema e encerra o programa corretamente. Quando não precisar mais da cópia, chame free exatamente uma vez; não é válido liberar o literal de origem nem usar a cópia depois de liberá-la.
Copie no máximo n bytes com strndup
strndup também é especificada pelo POSIX e declarada em <string.h>. Sua declaração é char *strndup(const char *s, size_t n);. A função copia no máximo n bytes de s e sempre acrescenta um byte nulo ao resultado alocado. O limite conta bytes, não caracteres; portanto, se o limite cair no meio da codificação de um caractere multibyte, esse caractere poderá ser cortado.
Por exemplo, strndup("C strings", 3) produz a string "C s". A área de memória retornada é alocada dinamicamente: verifique se o resultado é NULL e libere um resultado válido com free, assim como faria com strdup. O limite controla a quantidade copiada, não o tempo de vida nem a propriedade do resultado.
Entenda a alternativa strdupa, específica do GNU
strdupa é uma extensão da biblioteca GNU C, não uma função POSIX nem do padrão C. Quando necessário para expor sua declaração, defina _GNU_SOURCE antes de incluir os cabeçalhos do sistema. Assim como strdup, ela recebe uma string terminada em nulo e cria uma cópia, mas usa armazenamento automático associado à função atual em vez de retornar uma alocação na heap.
Esse armazenamento existe somente enquanto a função que o contém estiver ativa. Não retorne o ponteiro para uso depois que a função terminar e não o passe para free. A disponibilidade e a implementação dependem do ambiente GNU; use strdup quando precisar de uma interface POSIX ou de uma cópia cujo tempo de vida você controla com free. Este artigo não demonstra strdupa em um exemplo executável porque ela é específica de ambientes GNU.