logo

Differenza tra malloc() e calloc() con esempi

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:



  1. Numero di blocchi da allocare.
  2. 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

articoli Correlati