Allocazione Dinamica e l'Heap
In C, ogni oggetto ha una durata di memorizzazione (storage duration) che ne determina il ciclo di vita. Finora abbiamo visto variabili con durata automatica (variabili locali nello stack) e statica (variabili globali o dichiarate con static).
In questo capitolo esploriamo la memoria allocata dinamicamente, che ha una durata allocata. Questa memoria viene richiesta a runtime da un’area chiamata heap tramite un memory manager. È indispensabile quando non conosci in anticipo le dimensioni esatte dei dati (ad esempio, leggendo un file di testo o gestendo un database).
La funzione malloc
Section titled “La funzione malloc”La funzione malloc (Memory Allocation) alloca uno spazio contiguo in memoria della dimensione specificata in byte e restituisce un puntatore generico void * a quel blocco di memoria.
Il blocco allocato è non inizializzato, ovvero contiene valori casuali (spazzatura).
#include <stdlib.h>
typedef struct { char nome[20]; int eta;} Utente;
// Allocazione di spazio per un singolo UtenteUtente *u = (Utente *)malloc(sizeof(Utente));
if (u == NULL) { // Gestione dell'errore di allocazione}La funzione free
Section titled “La funzione free”A differenza della memoria automatica che si svuota da sola a fine blocco, la memoria dinamica deve essere liberata manualmente! Se non lo fai, il tuo programma continuerà a consumare RAM finché il sistema operativo non lo termina (un problema noto come Memory Leak).
Per liberare la memoria si usa la funzione free:
free(u);u = NULL; // Buona pratica: annullare il puntatore dopo averlo liberato💻 Esercizio Pratico: malloc e free
Section titled “💻 Esercizio Pratico: malloc e free”Completa il codice allocando dinamicamente un array di interi e liberandolo correttamente alla fine.