我编写了以下 C 函数,它在必要的内存分配后返回一个双指针。
// integer double pointer to 2d array
void** idp_to_2d ( int rows , int cols ) {
int i ;
void **est = malloc ( rows * sizeof ( int* ) ) ;
for ( i = 0 ; i <= rows ; i ++ )
est[i] = malloc ( cols * sizeof (int ) ) ;
return est ;
}
然后我使用来自 main()
的以下代码接收此指针:
int **est = ( int** ) idp_to_2d ( rows , cols ) ;
它工作正常,我可以像 est[i][j]
那样索引,这意味着内存分配正确。
现在我使用以下代码释放 main()
中的内存:
int i ;
for ( i = 0 ; i <= rows ; i ++ )
free ( est[i] ) ;
free ( est ) ;
现在我收到双重释放或损坏错误。
我的编译器是 gcc 4.9.2,OS 是 Ubuntu 15.04(64 位),我使用的是 NetBeans IDE 8.0.2.
最佳答案
您的 for 循环是错误的 - 您正在迭代太多行 - 更改:
for ( i = 0 ; i <= rows ; i ++ )
^^^
到:
for ( i = 0 ; i < rows ; i ++ )
^^^
在 malloc
循环和 free
循环中。
另外,虽然这不是一个错误,但你真的应该改变:
void** idp_to_2d(...
到:
int** idp_to_2d(...
当然还有:
void **est = malloc(...
到:
int **est = malloc(...
因为该函数返回一个 int **
而不是 void **
。 (在您的任何代码中使用 void **
确实没有意义。)
您还可以删除返回值的冗余(和潜在危险)转换,因此:
int **est = ( int** ) idp_to_2d ( rows , cols ) ;
只是:
int **est = idp_to_2d ( rows , cols ) ;
关于C内存分配和释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30237694/