Concetti Chiave
- L'allocazione della memoria in C si divide in automatica, statica e dinamica, ognuna gestita in modo diverso in base allo scope e alla durata delle variabili.
- L'allocazione automatica riguarda le variabili locali non statiche e gestisce la memoria automaticamente sullo stack.
- L'allocazione statica si applica a variabili globali e statiche, con memoria allocata nel data segment fino al termine del programma.
- L'allocazione dinamica richiede il coinvolgimento del programmatore per allocare memoria sull'heap a run-time utilizzando funzioni come malloc() e calloc().
- Le funzioni free() e realloc() sono utilizzate per liberare o modificare la dimensione della memoria allocata dinamicamente, rispettivamente.
Gestione dinamica della memoria
Allocazione della memoria è la situazione quando un blocco di memoria RAM viene assegnata ad un determinato programma in run-time. In C ci sono tre classi di allocazione di memoria:
- L’allocazione automatica: per variabili con scope locale non static. La memoria è automaticamente allocata sullo stack e automaticamente deallocata al termine della funzione
- L’allocazione statica: per variabili globali e variabili locali dichiarate static, la memoria è allocata nel data segment e rilasciata al termine del programma
- L’allocazione dinamica: per memoria richiesta a run-time esplicitamente del programmatore usando funzioni di libreria. Il blocco di memoria è allocato sullo heap
Il file header per la gestione dinamica della memoria e stdlib.h:
- Allocazione della memoria, occupare memoria:
-- Funzione di allocazione: malloc(), calloc(), che allocano byte contigui sull’heap
-- Restituiscono un puntatore void* al primo byte del blocco o NULL
- De allocazione della memoria, liberare memoria:
-- Funzione di de allocazione: free()
-- Rilascia memoria allocata usando malloc(), calloc(), realloc()
-- La memoria rilasciata può essere riutilizzata
- Modifica della dimensione di memoria
-- Funzione di modifica della dimensione: realloc()
-- Può essere usata per diminuire e aumentare la dimensione