Prima di comprendere le funzioni di malloc () e calloc (), per prima cosa, dobbiamo comprendere il significato dell'allocazione dinamica della memoria. L'allocazione della memoria è la procedura di assegnazione della memoria del computer per l'esecuzione di programmi e processi. Utilizziamo tecniche di allocazione dinamica quando non è noto prima di quanto spazio di memoria sia necessario per il programma e il processo.
L'allocazione della memoria dinamica si verifica a causa dei problemi associati all'allocazione della memoria statica, ad esempio se vengono memorizzati meno elementi, quindi il resto della memoria viene inutilmente sprecato. Pertanto, supera i problemi di allocazione della memoria statica in cui la memoria viene allocata solo quando è richiesta.
Grafico comparativo
Base del confronto | malloc () | calloc () |
---|---|---|
No di blocchi | Assegna un singolo blocco della memoria richiesta. | Assegna più blocchi della memoria richiesta. |
Sintassi | void * malloc (size_t size); | void * calloc (size_t num, size_t size); |
Inizializzazione | malloc () non cancella e inizializza la memoria allocata. | La memoria allocata viene inizializzata a zero utilizzando calloc (). |
Modalità di assegnazione | La funzione malloc () alloca la memoria della dimensione 'size' dall'heap. | La funzione calloc () alloca la memoria la cui dimensione è uguale a num * size. |
Velocità | Veloce | Comparativamente lento. |
Definizione di malloc ()
La funzione malloc assegna un blocco di memoria in byte . L'utente deve indicare esplicitamente la dimensione del blocco, che richiede per l'uso.
Attraverso il programma di funzione malloc richiede RAM del sistema per l'allocazione della memoria, se la richiesta è concessa (cioè, la funzione malloc dice che ha successo nell'allocazione della memoria), restituisce un puntatore al primo blocco di memoria. Restituisce il tipo di puntatore vuoto, che significa che è possibile assegnare qualsiasi tipo di puntatore.
Sebbene restituisca un valore NULL, se le funzioni di malloc non sono in grado di allocare la quantità di memoria richiesta. La funzione malloc è accessibile in TURBO C, file di intestazione alloc.h
o stdlib.h
, e su UNIX sarà disponibile nel file di intestazione .
SINTASSI
La sintassi di questa funzione è la seguente:
malloc(number of elements * size of each element);
per esempio, int *ptr;
ptr=malloc(10*sizeof (int))
Dove dimensione rappresenta la dimensione della memoria richiesta in byte (cioè il numero di posizioni di memoria contigue da allocare).
Ma come accennato prima la funzione malloc restituisce un puntatore void, di conseguenza è richiesto un operatore cast per modificare il tipo di puntatore restituito in base alle nostre necessità, la dichiarazione sopra potrebbe essere presentata nel seguente formato:
ptr_var=(type_cast* ) malloc (size)
Dove ptr_var
è il nome del puntatore che conserva l'indirizzo iniziale del blocco di memoria allocato, type_cast
è il tipo di dati in cui il puntatore restituito (o il tipo void) deve essere trasformato e la dimensione descrive la dimensione del blocco di memoria allocato in byte .
Per esempio: int *ptr;
ptr=(int*) malloc (10 * size of (int));
La memoria allocata per la funzione malloc contiene il valore della spazzatura .
Si noti che per verificare che la richiesta corrispondente venga generata da malloc per allocare la memoria concessa dalla RAM di sistema o rifiutata (nel caso in cui lo spazio richiesto non sia disponibile). Possiamo utilizzare la proprietà in cui non viene assegnata la quantità necessaria di memoria, la funzione malloc restituisce un valore NULL.
Definizione di calloc ()
La funzione calloc funziona esattamente come la funzione malloc escludendo il fatto che richiede due argomenti come nel caso di malloc () è necessario un solo argomento.
Per esempio: int*ptr;
ptr = (int*)calloc(10, 2);
Qui 2 specifica la dimensione del tipo di dati in un byte per il quale vogliamo che venga eseguita l'allocazione, che in questo caso è 2 per i numeri interi. E 10 indica il numero di elementi per i quali deve essere effettuata l'allocazione.
Ricorda che l'argomento passato alla funzione malloc era (n * 10), è un singolo argomento non essere confuso perché più argomenti sono sempre separati da virgole. L'argomento (n * 10) non ha virgole intermedie. Quindi è un argomento singolo, anche se non semplice ma un'espressione.
Ritornando alla dichiarazione di cui sopra, dopo l'esecuzione dell'istruzione di cui sopra, un blocco di memoria di 20 byte viene assegnato al programma richiedente e l'indirizzo del primo blocco viene assegnato al programma richiedente e l'indirizzo del primo blocco viene assegnato al puntatore ptr.
La memoria allocata dalla funzione calloc mantiene tutti gli zeri. La funzione calloc è anche ottenibile nel file di intestazione o
in TURBO C.
Differenze chiave tra malloc e calloc
Le principali differenze tra le funzioni di malloc e calloc sono:
- Un singolo blocco di memoria richiesto viene assegnato in malloc mentre i blocchi multipli di memoria richiesta vengono allocati da calloc.
- La funzione malloc non cancella e inizializza la memoria allocata. Contiene il valore della spazzatura e la voce della memoria allocata non può essere modificata. Al contrario, calloc inizializza la memoria allocata a zero.
- malloc è più veloce di calloc a causa della necessità di ulteriori passaggi di inizializzazione nel calloc, ma la differenza è trascurabile.
- Un'altra differenza tra questi due è che calloc è un malloc + memset, memset alloca le pagine fisiche in memoria mentre malloc assegna solo la memoria dall'heap nell'indirizzo virtuale.
Conclusione:
Entrambe le funzioni malloc e calloc sono utilizzate per l'allocazione della memoria e hanno il loro vantaggio, e svantaggio come malloc è veloce rispetto a calloc. Inoltre, malloc è più facile da usare in quanto richiede un solo argomento perché calloc alloca la memoria e inizializza l'area di memoria con ZERO. Ma preferiresti usare calloc quando l' inizializzazione delle variabili è più importante per te.