Geschichte des Themas
Mehrdimensionale Arrays in C wurden ursprünglich zur einfachen Arbeit mit Tabellen und Matrizen entworfen. Ein klassisches zweidimensionales Array ist ein Array von Arrays, das die Arbeit mit Elementen tabellarischer Daten mit einfacher Syntax ermöglicht. Im Laufe der Zeit hat sich der Ansatz weiterentwickelt, insbesondere bei der Arbeit mit Arrays variabler Länge.
Problem
Falsche Deklaration und Initialisierung von mehrdimensionalen Arrays führen zu Compilerfehlern oder logischen Problemen. Bei der Übergabe eines mehrdimensionalen Arrays an eine Funktion sind viele Entwickler verwirrt über die Anforderungen der Spezifikation – es ist erforderlich, die Größen aller Dimensionen außer der ersten explizit anzugeben.
Lösung
Deklaration eines zweidimensionalen Arrays:
int matrix[3][4];
Vollständige Initialisierung:
int matrix[2][3] = { {1, 2, 3}, {4, 5, 6} };
Weitergabe an eine Funktion – alle Größen außer der ersten müssen ausdrücklich angegeben werden:
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(" "); } }
Mit der Einführung des C99-Standards kann man Funktionen deklarieren, die Arrays variabler Länge akzeptieren:
void foo(int rows, int cols, int a[rows][cols]);
Schlüsselmerkmale:
1. Kann man eine Funktion deklarieren, die ein zweidimensionales Array ohne Angabe der zweiten Größe akzeptiert?
Nein, C erfordert, dass alle Größen außer der ersten zur Kompilierungszeit bekannt sind. Dies hängt mit der Zeigerarithmetik bei der Adressierung von Elementen zusammen.
Beispiel für einen Fehler:
// Fehler: void process(int arr[][], int rows); // Nicht erlaubt
2. Was passiert, wenn nicht alle Elemente eines mehrdimensionalen Arrays initialisiert werden?
Die verbleibenden Elemente werden automatisch mit Nullen gefüllt, wenn das Array statisch oder global ist. Bei einem lokalen Array mit teilweiser Initialisierung sind ebenfalls die nicht explizit initialisierten Elemente Nullen.
int a[2][3] = {{1}, {4}}; // a[0][1] und a[0][2], a[1][1] und a[1][2] werden 0
3. Was ist der Unterschied zwischen einem Array von Zeigern und einem zweidimensionalen Array?
Ein zweidimensionales Array ist ein zusammenhängender Speicherblock. Ein Array von Zeigern ist eine Sammlung von Zeigern auf separate (möglicherweise separat zugewiesene) eindimensionale Arrays. Dies ist beispielsweise wichtig bei der Zuweisung von Speicher für „unregelmäßige“ Arrays.
Der Versuch, ein zweidimensionales Array zu deklarieren und ohne Angabe der zweiten Größe an eine Funktion zu übergeben, was zu einem Compilerfehler führt. Eine oberflächliche Korrektur durch Ersetzen durch einen Zeiger führt zu undefiniertem oder fehlerhaftem Verhalten bei weiteren Berechnungen.
Vorteile:
Nachteile:
Der Entwickler gibt ausdrücklich die Größen aller Dimensionen an, erklärt in der Dokumentation die Anordnung der Elemente im Speicher und reduziert somit die Anzahl der Fehler bei der weiteren Wartung.
Vorteile:
Nachteile: