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;
    

Anmelden zum Antworten