dynamisches 2d- int array
-
Ich komme mit den Befehlen realloc und malloc für einen **int pointer nicht ganz zurecht, hab derwegn etwas gegoogelt und gelesen und bin dabei auf folgendes Program gestossen:
/* 2D_dyn_array.c */ #include <stdio.h> #include <stdlib.h> #define BUF 255 int main(void) { 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 = malloc(zeile * sizeof(int *)); if(NULL == matrix) { printf("Kein virtueller RAM mehr vorhanden ... !"); return EXIT_FAILURE; } /* jetzt noch Speicher reservieren für die einzelnen Spalten * der i-ten Zeile */ for(i = 0; i < zeile; i++) { matrix[i] = malloc(spalte * sizeof(int)); if(NULL == matrix[i]) { printf("Kein Speicher mehr fuer Zeile %d\n",i); return EXIT_FAILURE; } } /* 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"); } /* 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 EXIT_SUCCESS; }
Mir geht es eigentlic nur um die zwei Zeilen:
matrix = (int **)malloc(zeile * sizeof(int *)); matrix[i] = malloc(spalte * sizeof(int));
denn wenn ich nun den Speicher während des Programms mit realloc vergrößern will/muss könnte ich doch nun auch schreiben:
matrix[i] = (int *)realloc(matrix[i], spalte * sizeof(int)); matrix = (int **)realloc(matrix, zeile * sizeof(int *));
Wenns ich es nun compiliere funktioniert die erste Zeile, warum aber nicht die zweite??
Denn eigentlich sollte der Computer ja mit realloc selbsständig den Speicherbereich wo anders hinlegen und umkopiern...
-
krul schrieb:
/* 2D_dyn_array.c */ #include <stdio.h> #include <stdlib.h> #define BUF 255 int main(void) { 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 = malloc(zeile * sizeof(int *)); if(NULL == matrix) { printf("Kein virtueller RAM mehr vorhanden ... !"); return EXIT_FAILURE; } /* jetzt noch Speicher reservieren für die einzelnen Spalten * der i-ten Zeile */ for(i = 0; i < zeile; i++) { matrix[i] = malloc(spalte * sizeof(int)); if(NULL == matrix[i]) { printf("Kein Speicher mehr fuer Zeile %d\n",i); return EXIT_FAILURE; } } /* 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"); } /* 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 EXIT_SUCCESS; }
Was geht nicht und wann geht es nicht und wo geht es nicht.
PS: für das schöne Listing gibt es die cpp Tags. Code markieren und den C/C++ Button unter den
anklicken.
-
ok sorry fürs listing,
das programm an und für sich funktioniert schon, doch wenn ich die zeilen in denen der speicher angefordet wird von malloc auf realloc ändere
zeilen im orginal:
matrix = (int **)malloc(zeile * sizeof(int *)); matrix[i] = malloc(spalte * sizeof(int));
änderung auf realloc:
matrix[i] = (int *)realloc(matrix[i], spalte * sizeof(int)); matrix = (int **)realloc(matrix, zeile * sizeof(int *));
funktionierts nicht mehr, die erste zeile funktioniert noch aber warum die zweite nicht mehr
-
Wenn du die das in dem Listing änderst (Zeile 17 und Zeile 25) dann mach doch mal in Zeile 9
int ** matrix = NULL;