ProgrammierungEmbedded C Entwickler

Beschreiben Sie, wie man in der Programmiersprache C mehrdimensionale Arrays deklariert und verwendet. Welche Fallstricke gibt es bei der Übergabe an Funktionen und der Initialisierung?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort

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:

  • Es ist erforderlich, die Größen aller Dimensionen außer der ersten bei der Übergabe an Funktionen ausdrücklich anzugeben.
  • Ein mehrdimensionales Array in C ist ein Array von Arrays; die Elemente sind im Speicher zeilenweise (row-major order) angeordnet.
  • Teilweise Initialisierung initialisiert nicht angegebene Elemente mit Nullen.

Fangfragen.

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.

Typische Fehler und Anti-Pattern

  • Fehler bei der Deklaration von Funktionen mit mehrdimensionalen Arrays (fehlende Angabe der Größe der „inneren“ Dimensionen).
  • Verwirrung zwischen Zeilen und Spalten bei der Arbeit mit row-major layout.
  • Ein Array von Zeigern wird durch ein echtes mehrdimensionales Array ersetzt und umgekehrt.

Beispiel aus dem Leben

Negativer Fall

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:

  • Einfache Deklaration der Funktion (auf den ersten Blick).

Nachteile:

  • Compilerfehler, inkorrekte Indexarithmetik, Datenbeschädigung.

Positiver Fall

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:

  • Sicherer, korrekter und portabler Code.

Nachteile:

  • Die Größe des Arrays oder seine „Breite“ muss zur Compile-Zeit bekannt sein, oder der C99-Standard und variabel-längige Arrays sind erforderlich.