HOWTO · C

Usa la funzione strdup in C

Scopri come strdup duplica una stringa in C, come controllare e liberare la copia allocata e quando usare strndup o strdupa di GNU.

In questa pagina

strdup crea una copia con terminazione null di una stringa C e restituisce memoria allocata separatamente. Controlla il puntatore restituito prima di usarlo, quindi rilascia con free la copia creata correttamente. Usa strndup quando vuoi limitare il numero di byte copiati; strdupa è un’alternativa specifica di GNU, con una durata diversa.

Cosa fa strdup e dove è disponibile

La dichiarazione di strdup è char *strdup(const char *s); e si trova in <string.h>. La funzione copia i byte della stringa s, terminata da null, incluso il byte null finale, in una nuova area di memoria allocata. Il puntatore restituito fa riferimento a quell’area; se l’allocazione non riesce, la funzione restituisce NULL.

strdup non fa parte della libreria standard di C. È specificata da POSIX ed è disponibile in librerie C comuni, come la libreria GNU C. In modalità linguistica rigorosa, una piattaforma può richiedere una macro di test delle funzionalità per rendere visibile la dichiarazione. Se ti serve portabilità oltre i sistemi POSIX, consulta la documentazione della piattaforma di destinazione.

Duplicare una stringa con strdup

Definisci _POSIX_C_SOURCE prima di includere gli header, se la piattaforma lo usa per rendere visibile la dichiarazione POSIX. L’esempio controlla il risultato prima di leggerlo e rilascia la copia dopo l’uso. Nell’esecuzione riuscita stampa la stringa originale e la sua copia; le etichette del blocco di output rimangono in inglese.

Esegui questo esempio:

#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 restituisce NULL, non passare il puntatore alle funzioni per le stringhe e non chiamare free su di esso. Il ramo di errore sopra segnala il problema e termina correttamente. Quando la copia non serve più, chiama free una sola volta; non è valido liberare la stringa letterale di origine né usare la copia dopo averla liberata.

Copiare al massimo n byte con strndup

Anche strndup è specificata da POSIX ed è dichiarata in <string.h>. La sua dichiarazione è char *strndup(const char *s, size_t n);. Copia da s al massimo n byte e aggiunge sempre un byte null di terminazione al risultato allocato. Il limite si riferisce ai byte, non ai caratteri: se cade all’interno della codifica di un carattere multibyte, quel carattere può essere troncato.

Per esempio, strndup("C strings", 3) produce la stringa "C s". La memoria restituita è allocata dinamicamente: controlla quindi che il risultato non sia NULL e libera con free quello creato correttamente, come faresti con strdup. Il limite determina quanti byte vengono copiati, non la durata o la proprietà del risultato.

Comprendere l’alternativa strdupa specifica di GNU

strdupa è un’estensione della libreria GNU C, non una funzione POSIX né dello standard C. Quando necessario, definisci _GNU_SOURCE prima degli header di sistema per rendere visibile la dichiarazione. Come strdup, accetta una stringa terminata da null e ne crea una copia, ma usa memoria automatica associata alla funzione corrente invece di restituire un’allocazione nell’heap.

Quella memoria dura solo finché la funzione che la contiene è attiva. Non restituire il puntatore per usarlo dopo la fine della funzione e non passarlo a free. La disponibilità e l’implementazione dipendono dall’ambiente GNU; usa strdup se ti serve un’interfaccia POSIX o una copia la cui durata puoi controllare con free. Qui strdupa non è presentata con un esempio eseguibile perché è specifica degli ambienti GNU.