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.