realloc Fehlermeldung Invalid Argument

number_nine

Grünschnabel
Hallo,

ich habe mit malloc eine Matrix dynamisch erzeugt und möchte sie dann mittels realloc vergrößern. Dazu habe ich mir aus dem Netz folgenden Code gesucht:


Code:
int **realloc_2D(int **old_2d_array, size_t xalt, size_t yalt,
                size_t xneu, size_t yneu)
{

 int **neu_2d_array;
 int *p;
 size_t row;

 /*Benötigen wir Speicherplatz?..........*/
 if( xneu*yneu*sizeof(**neu_2d_array)>
     xalt*yalt*sizeof(**old_2d_array))
    /*Wir reservieren Speicher........*/
    neu_2d_array=realloc(old_2d_array, xneu*yneu*sizeof(**neu_2d_array));

 else
   neu_2d_array=old_2d_array;

 if(neu_2d_array == NULL)
  return NULL;
 else
  {

   for(row=xalt, p=(int *)neu_2d_array+xneu; row<xneu; row++, p+=yneu)
    neu_2d_array[row]=p;
  }

 return neu_2d_array;
}



int **malloc_2D(size_t x, size_t y)
{

 int **array_2d;
 int *p;
 size_t row;

 array_2d=malloc(x*y*sizeof(**array_2d));
 if(array_2d == NULL)
  return NULL;
 else
  {

   for(row=0, p=(int *)array_2d+x; row<x; row++, p+=y)
    array_2d[row]=p;
  }
 return array_2d;
}

Wenn ich die Funktion realloc_2D aufrufe, kommt als Fehler 'Invalid Argument'. Kann mir jemand sagen woran das liegt?

Danke schonmal
Jeannine
 
Hallo number_nine. Willkommen im Forum!

Es wäre ganz nützlich zu erfahren wie denn die Aufrufe aussehen und was du zwischendurch mit dem Array machst.

Gruß
 
Hallo,

ich wollte es einfach erstmal in einem Testprogramm ausprobieren-hier der Code:

Code:
int main()
{

 int **array;
 int i, j, total=0, row=4, col=7;
 int morerow=12, morecol=7;
 int value1=111;
 int value2=333;

 array=malloc_2D(row,col);
 if(array==NULL)
  {

   fprintf(stderr, "Kein Speicher für das 2D-Array-malloc bekommen......\n");
   exit(0);
  }

 for(i=0; i<row; i++)
  for(j=0; j<col; j++)
   array[i][j]=value1;

 for(i=0; i<row; i++){
   for(j=0; j<col; j++)
     printf("array[%d][%d]=%d\n",i,j,array[i][j]);
   printf("\n");
 }

 array=realloc_2D(array,row,col,morerow,morecol);
 if(array==NULL)
  {

   fprintf(stderr, "Kein Speicher für das 2D-Array-realloc bekommen......\n");
   exit(0);
  }

 for(i=0; i<morerow; i++)
  for(j=col; j<morecol; j++)
   array[i][j]=value2;

  for(i=0; i<morerow; i++)
   for(j=0; j<morecol; j++)
     printf("array[%d][%d]=%d\n",i,j,array[i][j]);

 return 0;
}

Gruß
 
Hi.

Ich weiß ja nicht wo du diesen Code her hast, aber so kann das nicht funktionieren.

Es ist ja so, dass für die Matrix mit m Reihen und n Spalten ein Array alloziert wird das (m * n) Elemente hat.

Dann werden allerdings die ersten m Elemente mit Zeigern überschrieben, so das man dann (obwohl es ein eindimensionales Array ist, die Elemente wie in einem 2 dimensionalen Array ansprechen kann. Da ist aber schon das erste Problem: wenn die erste Zeile bereits wegfällt, kann man nicht mehr (m * n) Elemente drin speichern sondern nur noch (m * n - m) Elemente.

Das könnte man ja noch gut ausmerzen, indem man einfach m Zellen mehr alloziert als für die Elemente der Matrix notwendig.

Doch selbst dann wird das reallozieren nicht funktionieren - was wiederum an der Struktur des Arrays liegt. Wenn die ersten m Elemente als Spaltenzeiger fungieren, dann müßte man bei einer Änderung der Zeilenanzahl den Inhalt des Arrays ganz clever umherkopieren und die Zeiger anpassen, damit durch das realloc nicht der Inhalt der Zellen des Arrays verändert wird.

Selbst dann ist es allerdings so, das ein realloc natürlich nicht unbedingt einfach neuen Speicher an das Array anhängen kann, sondern das komplett neu alloziert und das alte Array dann in den neuen Speicherbereich kopiert werden muß. Dabei werden dann die Spaltenzeiger (die ja vorher in das Array selbst gezeigt haben) ungültig und das Programm wird früher oder später wahrscheinlich abstürzen.

Am einfachsten wäre es wohl, wenn du nicht wirklich ein realloc machst (das funktioniert sowieso nur in den wenigsten Fällen) und einfach immer ein komplett neues Array anlegst und dann den Inhalt vom ersten Array kopierst. Beim Anlegen natürlich darauf achten eine Zeile mehr zu allozieren als für die Elemente notwendig.

Gruß
 
Hey,

danke für die gut verständliche Antwort, jetzt habe ich zumindest eine Vorstellung davon.

Ich werde das dann wohl so machen wie du es geschrieben hast.

Vielen Dank nochmal und Gruß
Jeannine
 
Zurück