То, что память была свободна, не означает, что вы не можете получить к ней доступ! Конечно, это очень плохая идея получить к нему доступ после того, как он будет бесплатным, но именно поэтому он работает в вашем примере.
Обратите внимание, что free( *first_matrix )
только для бесплатных first_matrix[0]
, а не для других массивов. Вы, вероятно, хотите, чтобы какой-то маркер обозначал последний массив (если только вы не будете всегда знать, когда освободите внешний массив, сколько внутренних массивов вы разместили). Что-то вроде:
int** read_matrix(int size_x, int size_y)
{
int** matrix;
matrix = calloc(size_x, 1+sizeof(int*)); // alloc one extra ptr
for(int i = 0;i<size_x;i++) {
matrix[i] = calloc(size_y, sizeof(int));
}
matrix[size_x] = NULL; // set the extra ptr to NULL
for(int i = 0;i<size_x;i++) {
for(int j = 0;j<size_y;j++) {
matrix[i][j] = i*10+j;
}
}
return matrix;
}
Затем, когда вы их освобождаете:
// keep looping until you find the NULL one
for( int i=0; first_matrix[i] != NULL; i++ ) {
free( first_matrix[i] );
}
free( first_matrix );