Auf der Web-Seite http://pronix.linuxdelta.de/C/standard_C/c_programmierung_17_1.shtml von Jürgen Wolf habe ich ein sehr interessantes Beispiel für zweidimensionale dynamische Arrays entdeckt.
Hier ist ein kleiner Ausschnitt (Kapitel 17.8) aus dem Artikel:
(Zitat Anfang)
Um also für ein zweidimensionales Array mit beliebig vielen Zeilen und Spalten Speicher zu reservieren, benötigen Sie zuerst Platz für die Zeile. Und für jede dieser Zeilen wird nochmals Platz für die Spalte benötigt. Beim Freigeben des Speichers muss dies in umgekehrter Reihenfolge vorgenommen werden.
Hierzu das vollständige Listing:
#include <stdio.h> #include <stdlib.h> #define BUF 255 int main () { int i, j, zeile, spalte; // Matrix ist Zeiger auf int-Zeiger int ** matrix; printf("Wie viele Zeilen : "); scanf("%d", &zeile); printf("Wie viele Spalten: "); scanf("%d", &spalte); // Speicher reservieren für die int-Zeiger (=zeile) matrix = (int **) malloc(zeile * sizeof(int *)); if (NULL == matrix) { printf("Kein Speicher fuer die Zeilen...\n"); exit(0); } // if // Jetzt noch Speicher reservieren für die einzelnen Spalten der i-ten Zeile for (i=0; i < zeile; i++) { matrix[i] = (int *) malloc(spalte * sizeof(int)); if (NULL == matrix[i]) { printf("Kein Speicher fuer Zeile %d\n", i); exit(0); } // if } // for (i) // Mit beliebigen Werten initialisieren for (i = 0; i < zeile; i++) for (j = 0; j < spalte; j++) matrix[i][j] = i+j; // matrix[zeile][spalte] // Inhalt der Matrix entsprechend ausgeben for (i = 0; i < zeile; i++) { for (j = 0; j < spalte; j++) printf("%d ", matrix[i][j]); printf("\n"); } // for (i) // Speicherplatz wieder freigeben // Wichtig! In umgekehrter Reihenfolge! // Spalten der i-ten Zeile freigeben for (i = 0; i < zeile; i++) free(matrix[i]); // Jetzt können die leeren Zeilen freigegeben werden free(matrix); return 0; } // main()
(Zitat Ende)
Und weiter…
(Zitat Anfang)
Hierzu eine Tabelle:
Zugriff auf … | Möglichkeit 1 | Möglichkeit 2 | Möglichkeit 3 |
---|---|---|---|
1.Zeile, 1.Spalte | **matrix | *matrix[0] | matrix[0][0] |
i.Zeile, 1.Spalte | **(matrix+i) | *matrix[i] | matrix[i][0] |
1.Zeile, i.Spalte | *(*matrix+i) | *(matrix[0]+i) | matrix[0][i] |
i.Zeile, j.Spalte | *(*(matrix+i)+j) | *(matrix[i]+j) | matrix[i][j] |
(Zitat Ende)
Quellenangabe:
Den kompletten Artikel findet man auf der Web-Seite http://pronix.linuxdelta.de/C/standard_C/c_programmierung_17_1.shtml des Authors Jürgen Wolf.
Stand: 28.10.2011 — : Jürgen Kreick
EOF