Concetti Chiave

  • malloc e calloc sono funzioni in C per l'allocazione di memoria, con calloc che inizializza la memoria a 0.
  • free è utilizzata per deallocare la memoria allocata dinamicamente, senza effetto se il puntatore è NULL.
  • realloc permette di modificare la dimensione della memoria puntata, restituendo un nuovo indirizzo o NULL se non è possibile estendere la memoria.
  • Utilizzare realloc con un puntatore valido e dimensione minore mantiene l'indirizzo originale, mentre una dimensione di 0 equivale a free.
  • Il comportamento è non definito se si utilizzano puntatori non validi con free o realloc, sottolineando l'importanza di una corretta gestione della memoria.

void *malloc ( size_t size ); //blocco contiguo di dimensione size

void *calloc ( size_t nmemb , size_t size ); //blocco contiguo di dimensione nmemb*size

Indice

  1. Differenze tra malloc e calloc
  2. Deallocazione della memoria
  3. Modifica della dimensione di memoria

Differenze tra malloc e calloc

La differenza tra le due funzioni è con l’utilizzo della funzione calloc() inizializza tutti i bit di memoria adibiti alla variabili a 0.

Restituiscono un puntatore void* al primo byte di memoria, ma per usare quella memoria è necessario effettuare un cast. Poichè array e puntatori si comportano allo stesso modo, si può accedere alla memoria allocata dinamicamente come fosse array.

Deallocazione della memoria

Deallocazione della memoria

void free(void *ptr);

la funzione usata per rilasciare la memoria allocata dinamicamente, disponibile in seguito per altre allocazioni.

Se ptr:

- punta a NULL, la funzione non fa nulla

- è un puntatore non valido, quindi non punta ad un indirizzo di memoria di malloc(), calloc(), realloc() o la variabile è già stata deallocata, il comportamento è non definito

È utile liberare memoria allocata dinamicamente quando non è più necessaria, poiché il C non ha un garbage collector (modalità automatica che gestisce la memoria, nel quale il compilatore libera autonomamente la memoria non più utilizzata).

Modifica della dimensione di memoria

Modifica della dimensione di memoria

void *realloc(void *ptr, size_t size);

La funzione usata per modificare la dimensione della memoria puntata da ptr nella dimensione specificata da size, la dimensione può sia aumentare sia diminuire. Se ptr:

- è NULL, realloc() è uguale a malloc()

- punta ad un indirizzo non valido, il comportamento è non definito

- punta ad un indirizzo valido e la dimensione size è minore della precedente, la funzione ritorna ptr

- punta ad un indirizzo valido e la dimensione size è maggiore della precedente, la funzione può:

-- Ritornare ptr, se si può estendere in modo contiguo la memoria

-- Ritornare un nuovo indirizzo di memoria (il blocco viene ricopiato in una nuova locazione)

-- Ritornare NULL se non è possibile allocare contiguamente la memoria richiesta

- punta ad un indirizzo valido e la dimensione è 0, realloc() è uguale a free()

Domande da interrogazione

  1. Qual è la principale differenza tra malloc e calloc?
  2. La principale differenza è che calloc inizializza tutti i bit di memoria a 0, mentre malloc non lo fa. Entrambe restituiscono un puntatore void* al primo byte di memoria, ma è necessario effettuare un cast per utilizzarle.

  3. Come si dealloca la memoria in C?
  4. La memoria allocata dinamicamente si dealloca utilizzando la funzione free(void *ptr). Se ptr è NULL, la funzione non fa nulla; se è un puntatore non valido, il comportamento è non definito. È importante liberare la memoria quando non è più necessaria, poiché il C non ha un garbage collector.

  5. Qual è la funzione utilizzata per modificare la dimensione della memoria allocata?
  6. La funzione utilizzata è realloc(void *ptr, size_t size). Questa funzione può aumentare o diminuire la dimensione della memoria puntata da ptr e il comportamento varia a seconda che ptr sia NULL, valido o non valido.

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community