Fre*_*rik 6 c pointers memory-management matrix
我在生成int矩阵时遇到了一些问题而没有产生内存泄漏.我希望能够通过read_matrix()动态地将给定(全局)矩阵制作成任何大小.但后来我希望能够在以后释放内存.所以在我的main方法中,第二个printf应该导致总线错误,因为它不应该分配任何内存.我将如何创建这个?
int** first_matrix;
int** second_matrix;
int** result_matrix;
int** read_matrix(int size_x, int size_y)
{
int** matrix;
matrix = calloc(size_x, sizeof(int*));
for(int i = 0;i<size_x;i++) {
matrix[i] = calloc(size_y, sizeof(int));
}
for(int i = 0;i<size_x;i++) {
for(int j = 0;j<size_y;j++) {
matrix[i][j] = i*10+j;
}
}
return matrix;
}
int main(int stackc, char** stack)
{
first_matrix = read_matrix(10,10);
printf("9:3 %d - 4:6 %d \n", first_matrix[9][3], first_matrix[4][6]);
free(*first_matrix);
free(first_matrix);
printf("9:3 %d - 4:6 %d \n", first_matrix[9][3], first_matrix[4][6]);
}
Run Code Online (Sandbox Code Playgroud)
仅仅因为内存已经免费并不意味着你无法访问它!当然,在它被免费后访问它是一个非常糟糕的主意,但这就是为什么它在你的例子中起作用的原因.
请注意,free( *first_matrix )只有free 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;
}
Run Code Online (Sandbox Code Playgroud)
那么当你解放它们时:
// keep looping until you find the NULL one
for( int i=0; first_matrix[i] != NULL; i++ ) {
free( first_matrix[i] );
}
free( first_matrix );
Run Code Online (Sandbox Code Playgroud)