c programmierung: dynamische 2D-arrays
-
Hallo Leute.
Stehe vor folgendem Problem:
Ich benötige ein 2-dimensionales array das in seiner Größe vaiable ist, also dynamisch. wie ein 1-dimensionales, dynamisches array programmiert wird weis ich aber das 2-dimensionale funktioniert anscheinend anders. Kann mir da jemand weiterhlefen?
mfg
-
#define A 350 #define B 101 int i, **field; field = malloc(A * sizeof(*field)); for (i = 0; i < A; ++i) field[i] = malloc(B * sizeof(**field));
Fehlerüberprüfung musst du noch einfügen.
-
...und am Ende das Aufräumen mit free nicht vergessen.
-
Wenn dein Compiler C99 beherrscht, geht das mit VLAs einfacher:
size_t dim_x = 100, dim_y = 10; int (*feld)[dim_x] = malloc(dim_y * dim_x * sizeof(int)); ... free(feld);
Allerdings können das nicht alle Compiler; insbesondere MSVC beherrscht C99 bis heute nicht, und Microsoft macht keinerlei Anstalten, es zu implementieren. Ich weiß nicht, ob das für dich ein Problem darstellt.
-
Sind Elemente unterhalb der obersten Ebene gleich groß, kann auf die Zeigervariante auch verzichtet werden:
/* Bsp. für ein int[50][100] Array (50 Zeilen mit jeweils 100 Elementen) */ #define DIM1N 100 #define DIM2N 50 typedef int Dim1[DIM1N]; int main() { int x,y; Dim1 *dim2array = calloc(DIM2N,sizeof*dim2array); for( y=0;y<DIM2N;++y ) for( x=0;x<DIM1N;++x ) printf("array(%d,%d)=%d",y+1,x+1,dim2array[y][x]=x*y); free( dim2array ); return 0; }
Einfache Änderungen an den defines benötigen keine Änderungen am folgenden Code.
Mittels realloc lässt sich die "Zeilen"-Zahl bei Bedarf auch noch dynamisch anpassen.
-
wie wärs denn mal mit einer effizienten variante:
guckst du:// Machst du 1D Array... T* my_array = malloc ( anzahl_zeilen*anzahl_spalten * sizeof(*my_array) ); //.. und statt my_array[y][x] adressierst du es dann so: my_array[y*anzahl_spalten+x] = .... .... // machst du etwas mit deinem neuen zeiger-speicher-sparendem array ;) ..... // und gibst den speicher wieder frei. :) free(my_array);