HOWTO · C

Utilice la función strdup en C

Aprenda cómo strdup duplica una cadena en C, cómo comprobar y liberar la copia asignada y cuándo usar strndup o strdupa de GNU.

En esta página

strdup crea una copia terminada en nulo de una cadena de C y devuelve memoria asignada por separado. Comprueba el puntero devuelto antes de usarlo y, si la copia se creó correctamente, libérala con free. Usa strndup cuando necesites limitar el número de bytes copiados; strdupa es una alternativa específica de GNU con un tiempo de vida distinto.

Qué hace strdup y dónde está disponible

La declaración de strdup es char *strdup(const char *s); y se encuentra en <string.h>. Copia los bytes de la cadena s, terminada en nulo, incluido su byte nulo final, en un espacio de almacenamiento recién asignado. El puntero devuelto apunta a ese espacio; si falla la asignación, la función devuelve NULL.

strdup no forma parte de la biblioteca estándar de C. Está especificada por POSIX y la ofrecen bibliotecas de C comunes, como la biblioteca GNU C. Puede que una plataforma requiera una macro de prueba de características para exponer la declaración al compilar en un modo estricto del lenguaje. Si necesitas portabilidad más allá de los sistemas POSIX, consulta la documentación de la plataforma de destino.

Duplicar una cadena con strdup

Define _POSIX_C_SOURCE antes de incluir las cabeceras si la plataforma la usa para exponer la declaración de POSIX. El ejemplo comprueba el resultado antes de leerlo y libera la copia después de usarla. En la ejecución correcta, muestra la cadena original y su duplicado; las etiquetas que aparezcan en el bloque de salida permanecen en inglés porque ese bloque conserva exactamente los bytes del original.

Ejecuta este ejemplo:

#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 devuelve NULL, no pases el puntero a funciones de cadenas ni llames a free con él. La rama de error anterior informa del problema y termina limpiamente. Cuando ya no necesites la copia, llama a free exactamente una vez; no es válido liberar el literal de origen ni usar la copia después de liberarla.

Copiar como máximo n bytes con strndup

strndup también está especificada por POSIX y se declara en <string.h>. Su declaración es char *strndup(const char *s, size_t n);. Copia como máximo n bytes de s y siempre añade un byte nulo final al resultado asignado. El límite cuenta bytes, no caracteres; por eso, si cae dentro de la codificación de un carácter multibyte, puede cortarlo a la mitad.

Por ejemplo, strndup("C strings", 3) produce la cadena "C s". El espacio de almacenamiento devuelto se asigna dinámicamente, así que comprueba si el resultado es NULL y libera con free cualquier resultado válido, igual que con strdup. El límite controla cuánto se copia, no el tiempo de vida ni quién es responsable del resultado.

Entender la alternativa strdupa específica de GNU

strdupa es una extensión de la biblioteca GNU C, no una función de POSIX ni del estándar C. Cuando sea necesario para exponer su declaración, define _GNU_SOURCE antes de incluir las cabeceras del sistema. Al igual que strdup, acepta una cadena terminada en nulo y crea una copia, pero usa almacenamiento automático asociado a la función actual en lugar de devolver una asignación en el montón.

Ese almacenamiento solo dura mientras la función que lo contiene siga activa. No devuelvas el puntero para usarlo después de que termine la función ni lo pases a free. Su disponibilidad e implementación dependen del entorno GNU; usa strdup si necesitas una interfaz POSIX o una copia cuyo tiempo de vida puedas controlar con free. Aquí no se muestra strdupa como ejemplo ejecutable porque es específica de los entornos GNU.