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);
    

Anmelden zum Antworten