Se non conosci la dimensione esatta della memoria che devi usare, hai bisogno dell'allocazione dinamica ( malloc
). Un esempio potrebbe essere quando un utente apre un file nella tua applicazione. Dovrai leggere il contenuto del file in memoria, ma ovviamente non conosci in anticipo la dimensione del file, poiché l'utente seleziona il file sul posto, in fase di esecuzione. Quindi fondamentalmente hai bisogno malloc
quando non conosci in anticipo la dimensione dei dati con cui stai lavorando. Almeno questo è uno dei motivi principali per l'utilizzo malloc
. Nel tuo esempio con una stringa semplice di cui conosci già la dimensione in fase di compilazione (in più non vuoi modificarla), non ha molto senso allocarla dinamicamente.
Un po 'fuori tema, ma ... devi stare molto attento a non creare perdite di memoria durante l'utilizzo malloc
. Considera questo codice:
int do_something() {
uint8_t* someMemory = (uint8_t*)malloc(1024);
// Do some stuff
if ( /* some error occured */ ) return -1;
// Do some other stuff
free(someMemory);
return result;
}
Vedi cosa c'è di sbagliato in questo codice? C'è un'istruzione di ritorno condizionale tra malloc
e free
. All'inizio potrebbe sembrare a posto, ma pensaci. Se c'è un errore, tornerai senza liberare la memoria che hai allocato. Questa è una fonte comune di perdite di memoria.
Ovviamente questo è un esempio molto semplice, ed è molto facile vedere l'errore qui, ma immagina centinaia di righe di codice disseminate di puntatori, malloc
s, se free
tutti i tipi di gestione degli errori. Le cose possono diventare davvero complicate molto velocemente. Questo è uno dei motivi per cui preferisco di gran lunga il C ++ moderno rispetto al C nei casi applicabili, ma questo è un argomento completamente diverso.
Quindi, ogni volta che lo usi malloc
, assicurati sempre che la tua memoria sia il più probabile free
possibile.
malloc()
può fallire!