calloc vs. malloc

Quando si utilizza calloc per allocare un blocco di memoria, la regione allocata viene inizializzata su zero. Al contrario, malloc non tocca il contenuto del blocco di memoria allocato, il che significa che contiene valori di garbage. Questo potrebbe potenzialmente costituire un rischio per la sicurezza poiché i contenuti della memoria sono imprevedibili e gli errori di programmazione possono comportare una perdita di tali contenuti.

Tabella di confronto

grafico comparativo calloc contro malloc
calloc malloc
Funzionealloca una regione di memoria abbastanza grande da contenere "n elementi" di "dimensione" byte ciascuno. Inizializza anche il contenuto della memoria a zero.alloca byte di "dimensione" di memoria.
Numero di argomenti21
Sintassivoid * calloc (number_of_blocks, size_of_each_block_in_bytes);void * malloc (size_in_bytes);
Contenuto della memoria allocataLa regione allocata viene inizializzata su zero.Il contenuto della memoria allocata non viene modificato. cioè, la memoria contiene valori imprevedibili o spazzatura. Questo presenta un rischio.
Valore di ritornopuntatore vuoto (vuoto *). Se l'allocazione ha esito positivo, viene restituito un puntatore al blocco di memoria. Se l'allocazione della memoria non riesce, viene restituito un puntatore NULL.puntatore vuoto (vuoto *). Se l'allocazione ha esito positivo, viene restituito un puntatore al blocco di memoria. Se l'allocazione della memoria non riesce, viene restituito un puntatore NULL.

Sintassi ed esempi

malloc ()

 void * malloc (size_t size); 

alloca i byte di size della memoria. Se l'allocazione ha esito positivo, viene restituito un puntatore alla memoria allocata. Altrimenti viene restituito NULL . Esempio:

 / * Alloca memoria per un array con 15 elementi di tipo int . * / int * ptr = malloc (15 * sizeof (int)); if (ptr == NULL) {/ * Impossibile allocare memoria, quindi stampare un errore ed uscire. * / fprintf (stderr, "Impossibile allocare memoria \ n"); uscita (EXIT_FAILURE); } / * Allocazione riuscita. * / 

Nota che malloc richiede che calcoliamo i byte di memoria di cui abbiamo bisogno e che li passi come argomento a malloc.

calloc ()

 void * calloc (size_t nelements, size_t byte); 

alloca un blocco contiguo di memoria abbastanza grande da contenere nelements di bytes di dimensione bytes . La regione allocata viene inizializzata su zero. Nell'esempio sopra:

 / * Alloca spazio per un array con 15 elementi di tipo int e inizializza a zero. * / int * ptr = calloc (15, sizeof (int)); if (ptr == NULL) {/ * Impossibile allocare memoria, quindi stampare un errore ed uscire. * / fprintf (stderr, "Impossibile allocare memoria \ n"); uscita (EXIT_FAILURE); } / * Allocazione riuscita. * / 

calloc (m, n) è uguale a

 p = malloc (m * n); if (p) memset (p, 0, m * n); 

Video Spiegazione di Calloc, Malloc e Realloc

Questo tutorial video spiega le funzioni di allocazione della memoria malloc, calloc e realloc, nonché la funzione di malloc della memoria free :

Considerazioni sulla sicurezza

È generalmente una buona idea usare calloc su malloc . Quando si utilizza malloc, i contenuti della memoria allocata sono imprevedibili. Gli errori di programmazione possono causare la perdita di questi contenuti di memoria in modi involontari ma altamente vulnerabili. Un buon esempio di tale perdita è la vulnerabilità Heartbleed in OpenSSL, il cui meccanismo di base è spiegato in questo fumetto XKCD e alcuni dettagli tecnici più sono in questo post del blog.

Velocità di esecuzione

calloc è leggermente più lento di malloc a causa del passaggio aggiuntivo di inizializzazione dell'area di memoria allocata. Tuttavia, in pratica la differenza di velocità è molto piccola e può essere ignorata.

Articoli Correlati