D
OK, habe meinen Fehler gefunden: x = realloc(x, size) macht mehr Sinn als nur realloc(x, size).
Jetzt ist aber ein neues Problem aufgetreten:
Laut dem Buch 'Softwareentwicklung in C' von Klaus Schmaranz besteht die quadratische Vergrößerung eines 2 dim Arrays aus 3 Schritten:
+++++
+++++
+++++
1. rows vektor vergrößern
array = realloc(array, new_rows * sizeof(int *);
+++++
+++++
+++++
*
*
2. cols vekoren, die bereits vorhanden waren, vergrößern
for (i = 0; i < old_rows; i++)
{
array[i] = realloc(array[i], new_cols * sizeof(int));
}
+++++**
+++++**
+++++**
*
*
3. neue cols vektoren erstellen
for (i = old_rows; i < new_rows; i++)
{
array[i] = malloc(new_cols * sizeof(int));
}
+++++**
+++++**
+++++**
*******
*******
(new_cols == new_rows, nachdem es sich dann um ein quadratisches Array handeln soll)
Wenn ich jetzt aber ein 10*5 Array quadratisieren (10*10) will, kann ich mir Schritt 2 ja ersparen, bleiben noch Schritte 1 & 3. Wenn ich das aber versuche, kommt es beim Auslesen zu einem Fehler. Lasse ich aber Schritt 1 ebenfalls weg, so funktioniert es - WARUM?? Das darf doch nicht sein, oder? Genau das Umgekehrte hätte ich erwartet, nämlich eine Zugriffsverletzung wenn ich VERGESSE, den rows Vektor zu vergrößern.
Ein 5*10 Array (unter Verwendung des Schrittes 2 mit entsprechender) zu quadratisieren funktioniert aber wie erwartet.
Benutze übrigens lccwin32.
Hier mein code snippet:
// ------------------------------------------------------------------
void transpMatrix(int **array, int rows, int cols)
{
int size = 0;
int i, j;
if (rows != cols)
{
if (rows > cols)
{
size = rows;
for (i = 0; i < size ; i++)
{
array[i] = realloc(array[i], size * sizeof(int));
for (j = cols; j < size ; j++)
{
array[i][j] = 0;
}
}
}
else
{
size = cols;
array = realloc(array, size * sizeof(int*)); // ohne diese Zeile funktioniert es
for (i = rows; i < size ; i++)
{
array[i] = malloc(size * sizeof(int));
for (j = 0; j < size ; j++)
{
array[i][j] = 0;
}
}
}
}
}