Skip to content

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 (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 Utente
Utente *u = (Utente *)malloc(sizeof(Utente));
if (u == NULL) {
// Gestione dell'errore di allocazione
}

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

Completa il codice allocando dinamicamente un array di interi e liberandolo correttamente alla fine.