Это будет работать:
void freeMatrix( int **matrix )
{
free( matrix[ 0 ] );
free( matrix );
}
Потому что для i == 0
этот код
matrix[i] = &(arr[i*cols]);
устанавливает matrix[ 0 ]
на адрес arr[0]
, который является тем же значением, которое возвращается после первого malloc
вызова:
int* arr = malloc(rows*cols*sizeof(int));
Будет понятнее, если вы напишите матричное распределение, например
int** allocateMatrix(int rows, int cols)
{
int** matrix = malloc(rows*sizeof(int*));
matrix[ 0 ] = malloc(rows*cols*sizeof(int));
int i;
for(i=1; i<rows; i++)
{
matrix[i] = &(arr[i*cols]);
}
return matrix;
}
Обратите внимание на изменение порядка malloc()
, прямое присвоение matrix[ 0 ]
и изменение индекса цикла, начиная с 1
.