calloc contro malloc

quando calloc viene utilizzato per allocare un blocco di memoria, la regione allocata viene inizializzata a zero. In contrasto, malloc non tocca il contenuto del blocco di memoria assegnato, il che significa che contiene valori obsoleti. Questo potrebbe essere potenzialmente un rischio per la sicurezza perché il contenuto della memoria è imprevedibile e gli errori di programmazione possono causare una perdita di questi contenuti.

Grafico comparativo

tabella di confronto calloc contro malloc
callocmalloc
Funzione alloca una regione di memoria abbastanza grande da contenere "n elementi" di byte "size" ciascuno. Inizializza anche i contenuti della memoria a zero. alloca "size" byte di memoria.
Numero di argomenti 2 1
Sintassi void * calloc (number_of_blocks, size_of_each_block_in_bytes); void * malloc (size_in_bytes);
Contenuto della memoria allocata La regione allocata viene inizializzata a zero. Il contenuto della memoria allocata non viene modificato. Ad esempio, la memoria contiene valori imprevedibili o illeggibili. Questo presenta un rischio.
Valore di ritorno pointer void (void *). Se l'allocazione ha esito positivo, viene restituito un puntatore al blocco di memoria. Se l'allocazione della memoria fallisce, viene restituito un puntatore NULL. pointer void (void *). Se l'allocazione ha esito positivo, viene restituito un puntatore al blocco di memoria. Se l'allocazione della memoria fallisce, viene restituito un puntatore NULL.

Contenuto: calloc vs. malloc

  • 1 Sintassi ed esempi
    • 1.1 malloc ()
    • 1.2 calloc ()
  • 2 Video che spiega Calloc, Malloc e Realloc
  • 3 Considerazioni sulla sicurezza
  • 4 Velocità di esecuzione
  • 5 riferimenti

Sintassi ed esempi

malloc ()

void * malloc (size_t size); 

alloca taglia byte di memoria. Se l'allocazione ha esito positivo, viene restituito un puntatore alla memoria allocata. Altrimenti NULLO viene restituito. Esempio:

/ * Assegna memoria per un array con 15 elementi di tipo int. * / int * ptr = malloc (15 * sizeof (int)); if (ptr == NULL) / * La memoria non può essere allocata, quindi stampare un errore ed uscire. * / fprintf (stderr, "Impossibile allocare memoria \ n"); uscita (EXIT_FAILURE);  / * L'allocazione è riuscita. * / 

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

calloc ()

void * calloc (size_t nelements, size_t bytes); 

alloca un blocco contiguo di memoria abbastanza grande da contenere Nelements di dimensioni byte ogni. La regione allocata viene inizializzata a zero. Nell'esempio sopra:

/ * Assegna spazio per un array con 15 elementi di tipo int e inizializza a zero. * / int * ptr = calloc (15, sizeof (int)); if (ptr == NULL) / * La memoria non può essere allocata, quindi stampa un errore ed esci. * / fprintf (stderr, "Impossibile allocare memoria \ n"); uscita (EXIT_FAILURE);  / * L'allocazione è riuscita. * / 

calloc (m, n) è lo stesso di

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

Video che spiega Calloc, Malloc e Realloc

Questo tutorial video spiega le funzioni di allocazione della memoria malloc, calloc e realloc, così come la funzione di disallocazione della memoria gratuito:

Considerazioni sulla sicurezza

È generalmente una buona idea da usare calloc al di sopra di malloc. Quando si utilizza malloc, i contenuti della memoria allocata sono imprevedibili. 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 sono in questo post del blog.

Velocità di esecuzione

calloc è un po 'più lento di malloc a causa del passo aggiuntivo di inizializzare l'area di memoria allocata. Tuttavia, in pratica la differenza di velocità è molto piccola e può essere ignorata.

Riferimenti

  • calloc pagina man
  • malloc pagina man