Le funzioni malloc() E calloc() sono funzioni di libreria che allocano la memoria in modo dinamico. Dinamico significa che la memoria viene allocata durante il runtime (esecuzione del programma) dal segmento heap.
Inizializzazione
malloc() alloca un blocco di memoria di determinata dimensione (in byte) e restituisce un puntatore all'inizio del blocco. malloc() non inizializza la memoria allocata. Se provi a leggere dalla memoria allocata senza prima inizializzarla, invocherai un comportamento non definito, il che di solito significa che i valori letti saranno valori spazzatura.
nome utente
calloc() alloca la memoria e inizializza anche ogni byte nella memoria allocata su 0. Se provi a leggere il valore della memoria allocata senza inizializzarla, otterrai 0 poiché è già stato inizializzato a 0 da calloc().
Parametri
malloc() accetta un singolo argomento, ovvero il numero di byte da allocare.
A differenza di malloc(), calloc() accetta due argomenti:
- Numero di blocchi da allocare.
- Dimensione di ciascun blocco in byte.
Valore di ritorno
Dopo l'allocazione riuscita in malloc() e calloc(), viene restituito un puntatore al blocco di memoria altrimenti viene restituito NULL che indica un errore.
Esempio
Il codice C seguente dimostra la differenza tra le funzioni malloc e calloc per allocare memoria dinamica.
C
// C code that demonstrates the difference> // between calloc and malloc> #include> #include> int> main()> {> >// Both of these allocate the same number of bytes,> >// which is the amount of bytes that is required to> >// store 5 int values.> >// The memory allocated by calloc will be> >// zero-initialized, but the memory allocated with> >// malloc will be uninitialized so reading it would be> >// undefined behavior.> >int>* allocated_with_malloc =>malloc>(5 *>sizeof>(>int>));> >int>* allocated_with_calloc =>calloc>(5,>sizeof>(>int>));> >// As you can see, all of the values are initialized to> >// zero.> >printf>(>'Values of allocated_with_calloc: '>);> >for> (>size_t> i = 0; i <5; ++i) {> >printf>(>'%d '>, allocated_with_calloc[i]);> >}> >putchar>(>'
'>);> >// This malloc requests 1 terabyte of dynamic memory,> >// which is unavailable in this case, and so the> >// allocation fails and returns NULL.> >int>* failed_malloc =>malloc>(1000000000000);> >if> (failed_malloc == NULL) {> >printf>(>'The allocation failed, the value of '> >'failed_malloc is: %p'>,> >(>void>*)failed_malloc);> >}> >// Remember to always free dynamically allocated memory.> >free>(allocated_with_malloc);> >free>(allocated_with_calloc);> }> |
>
>Produzione
Values of allocated_with_calloc: 0 0 0 0 0 The allocation failed, the value of failed_malloc is: (nil)>
Differenza tra malloc() e calloc() in C
Vediamo le differenze in forma tabellare:
| Si No. | malloc() | calloc() |
|---|---|---|
| 1. | malloc() è una funzione che crea un blocco di memoria di dimensione fissa. | calloc() è una funzione che assegna un numero specificato di blocchi di memoria a una singola variabile. |
| 2. | malloc() accetta solo un argomento | calloc() accetta due argomenti. |
| 3. ciclo del programma Java | malloc() è più veloce di calloc. | calloc() è più lento di malloc() |
| 4. | malloc() ha un'elevata efficienza temporale | calloc() ha una bassa efficienza temporale |
| 5. | malloc() viene utilizzato per indicare l'allocazione della memoria | calloc() viene utilizzato per indicare l'allocazione di memoria contigua |
| 6. | Sintassi: void* malloc(size_t size); | Sintassi: void* calloc(size_t num, size_t size); |
| 8. | malloc() non inizializza la memoria su zero | calloc() inizializza la memoria a zero |
| 9. | malloc() non aggiunge alcun sovraccarico di memoria aggiuntivo | calloc() aggiunge un sovraccarico di memoria aggiuntivo |