Storia della questione
Nel linguaggio C il lavoro con gli array è un aspetto fondamentale della programmazione. C fornisce due tipi principali di array: statici (la cui dimensione è nota al momento della compilazione e viene allocata nello stack, o nell'area di memoria statica/globale) e dinamici (la cui dimensione è stabilita durante l'esecuzione). Gli array statici sono utilizzati sin dalla creazione del linguaggio C, sottolineando le prestazioni e la semplicità.
Problema
Se non si comprende la differenza tra array statici e dinamici, si possono incontrare errori: uscita dai limiti dell'array, mancanza di liberazione della memoria o errori nella gestione del ciclo di vita dei dati. Un'inizializzazione errata degli array statici può portare alla lettura di dati trascurati o non inizializzati.
Soluzione
La dichiarazione di un array statico appare così:
int arr[5] = {1, 2, 3, 4, 5};
In questo caso, la dimensione e il contenuto dell'array sono definiti al momento della compilazione, la memoria viene allocata nello stack (per gli array automatici locali) o nella memoria statica (quando si dichiara l'array come statico o globale). È necessario prestare particolare attenzione all'inizializzazione parziale, quando gli elementi non specificati vengono riempiti con zeri.
La dimensione di un array statico non può essere cambiata durante l'esecuzione del programma, il che lo differenzia da quello dinamico.
Caratteristiche principali:
1. Cosa succede se non si inizializza esplicitamente un array statico in una funzione?
Gli array statici automatici (auto) locali hanno elementi non inizializzati con valori indefiniti. Tuttavia, se l'array è dichiarato con il modificatore statico o come globale, tutti gli elementi saranno inizializzati a zero per impostazione predefinita.
Esempio:
void foo() { int arr1[3]; // Valori non definiti! static int arr2[3]; // Tutti gli elementi uguali a 0 }
2. È possibile passare un array statico a una funzione in modo che la funzione possa cambiarne la dimensione?
No, la dimensione di un array statico non può essere cambiata — è rigidamente definita al momento della dichiarazione. La funzione può lavorare con il suo contenuto, ma non con la dimensione.
Esempio di passaggio corretto dell'array:
void processArray(int arr[], int size) { arr[0] = 42; }
3. Cosa succede quando si esce dai limiti di un array statico? Si verificherà un errore di runtime?
No, il linguaggio C non verifica l'uscita dai limiti dell'array. Tale comportamento è considerato comportamento indefinito e può portare a arresti anomali, corruzione dei dati o errori nascosti.
Un sviluppatore dichiara un array locale, dimentica di inizializzarlo e poi lo usa in un ciclo. Il programma fornisce risultati variabili ad ogni esecuzione, a volte si verifica un arresto anomalo durante la lettura.
Pro:
Contro:
Un sviluppatore inizializza esplicitamente l'array con valori o lo dichiara come statico per un'inizializzazione automatica a zero. Controlla sempre la dimensione e i limiti durante l'uso dell'array.
Pro:
Contro: