Storia della domanda
Gli array multidimensionali nel linguaggio C sono stati originariamente concepiti per semplificare il lavoro con tabelle e matrici. Un classico array bidimensionale è un array di array, con la possibilità di lavorare con gli elementi di dati tabellari utilizzando una sintassi semplice. Col tempo, l'approccio si è evoluto, soprattutto quando si lavora con array di lunghezza variabile.
Problema
Una dichiarazione e inizializzazione errate degli array multidimensionali portano a errori di compilazione o guasti logici. Quando si passa un array multidimensionale a una funzione, molti sviluppatori si confondono a causa dei requisiti della specifica — è necessario specificare esplicitamente le dimensioni tranne la prima.
Soluzione
Dichiarazione di un array bidimensionale:
int matrix[3][4];
Inizializzazione completa:
int matrix[2][3] = { {1, 2, 3}, {4, 5, 6} };
Trasmissione a funzione — tutte le dimensioni tranne la prima devono essere specificate esplicitamente:
void printMatrix(int m[][3], int rows) { for (int i = 0; i < rows; ++i) { for (int j = 0; j < 3; ++j) printf("%d ", m[i][j]); printf(" "); } }
Con l'introduzione dello standard C99 è possibile dichiarare funzioni che accettano array di lunghezza variabile:
void foo(int rows, int cols, int a[rows][cols]);
Caratteristiche chiave:
1. È possibile dichiarare una funzione che accetta un array bidimensionale senza specificare la seconda dimensione?
No, C richiede che tutte le dimensioni tranne la prima siano conosciute al momento della compilazione. Ciò è dovuto all'aritmetica dei puntatori quando si accede agli elementi.
Esempio di errore:
// Errore: void process(int arr[][], int rows); // Non è possibile
2. Cosa succede se si inizializzano solo alcuni elementi di un array multidimensionale?
Gli elementi rimanenti verranno automaticamente riempiti con zeri, se l'array è statico o globale. Per un array locale con inizializzazione parziale, gli elementi non inizializzati saranno anch'essi a zero.
int a[2][3] = {{1}, {4}}; // a[0][1] e a[0][2], a[1][1] e a[1][2] diventeranno 0
3. Qual è la differenza tra un array di puntatori e un array bidimensionale?
Un array bidimensionale è un singolo blocco di memoria. Un array di puntatori è un insieme di puntatori a singoli (possibilmente allocati separatamente) array monodimensionali. Questo è importante, ad esempio, quando si allocano memorie per array "a pezzi".
Tentativo di dichiarare e passare un array bidimensionale senza specificare la seconda dimensione in una funzione, portando a un errore di compilazione. Una correzione superficiale sostituendolo con un puntatore porta a un comportamento indefinito o errato durante i calcoli successivi.
Vantaggi:
Svantaggi:
Il programmatore specifica chiaramente le dimensioni di tutte le dimensioni, spiegando nella documentazione l'ordine di memorizzazione degli elementi in memoria, riducendo così il numero di errori in futuro.
Vantaggi:
Svantaggi: