VLA e Array Flessibili
Abbiamo visto che malloc alloca la memoria sull’heap, che è vasto ma richiede deallocazione manuale (free). Esistono anche metodi per allocare memoria flessibile dinamicamente usando lo stack.
Variable-Length Arrays (VLA)
Section titled “Variable-Length Arrays (VLA)”Introdotti dal C99, i VLA permettono di usare una variabile (non costante) per dichiarare la dimensione di un array locale. A differenza di malloc, un VLA alloca la sua memoria direttamente nello stack (nello stack frame della funzione) e viene liberata in automatico all’uscita della funzione.
void analizza_dati(size_t grandezza) { // La grandezza è nota solo a runtime! int buffer[grandezza]; // Questo è un VLA
// Non devi chiamare free(buffer)! // Si distruggerà da solo alla fine del blocco.}Flexible Array Members
Section titled “Flexible Array Members”Dallo standard C99 è possibile inserire un “Array con lunghezza zero” o “senza dimensione” alla fine della dichiarazione di una struttura. È utilissimo per la serializzazione, per pacchetti di rete o per la creazione di container dati.
typedef struct { size_t lunghezza; int dati[]; // Incompleto: non ha una dimensione fissa, deve essere l'ultimo!} Pacchetto;Quando vuoi creare il pacchetto, usi la malloc per allocare lo spazio della struttura e aggiungi lo spazio per gli elementi dell’array:
size_t elementi = 10;Pacchetto *p = malloc(sizeof(Pacchetto) + (sizeof(int) * elementi));if (p) { p->lunghezza = elementi; p->dati[0] = 5; // Utilizzo valido! L'array flessibile poggia sui byte aggiuntivi.}La funzione alloca (Non-standard ma famosa)
Section titled “La funzione alloca (Non-standard ma famosa)”Prima dei VLA, si usava spesso la funzione intrinseca alloca() (es. su sistemi Unix). Si comporta esattamente come malloc, ma riserva lo spazio sullo stack. Viene liberata in modo identico ai VLA.
È sconsigliata: non fa parte dello standard C, è propensa ad overflow non rilevabili ed è difficile capire se le ottimizzazioni del compilatore stanno entrando in conflitto con la gestione della memoria. I VLA sono l’alternativa preferita se lo stack è necessario.
💻 Esercizio Pratico: VLA con Input Dinamico
Section titled “💻 Esercizio Pratico: VLA con Input Dinamico”In questo esercizio il programma riceve da standard input (o come simulato) la grandezza dell’array. Usa questa dimensione per allocare un VLA.