ash*_*ntu 4 c memory-management
我编写了以下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 ;
}
Run Code Online (Sandbox Code Playgroud)
然后我使用以下代码从以下代码接收此指针main():
int **est = ( int** ) idp_to_2d ( rows , cols ) ;
Run Code Online (Sandbox Code Playgroud)
它工作正常,我可以索引像est[i][j]意味着内存被正确分配.
现在我main()使用下面的代码释放内存:
int i ;
for ( i = 0 ; i <= rows ; i ++ )
free ( est[i] ) ;
free ( est ) ;
Run Code Online (Sandbox Code Playgroud)
现在我得到双重免费或腐败错误.
我的编译器是gcc 4.9.2,OS是Ubuntu 15.04(64位),我使用的是NetBeans IDE 8.0.2.
Pau*_*l R 11
你的for循环是错误的 - 你正在迭代太多行 - 更改:
for ( i = 0 ; i <= rows ; i ++ )
^^^
Run Code Online (Sandbox Code Playgroud)
至:
for ( i = 0 ; i < rows ; i ++ )
^^^
Run Code Online (Sandbox Code Playgroud)
在malloc循环和free循环中.
void** idp_to_2d(...
Run Code Online (Sandbox Code Playgroud)
至:
int** idp_to_2d(...
Run Code Online (Sandbox Code Playgroud)
而且当然:
void **est = malloc(...
Run Code Online (Sandbox Code Playgroud)
至:
int **est = malloc(...
Run Code Online (Sandbox Code Playgroud)
因为函数返回的int **不是a void **.(void **在任何代码中使用都没有意义.)
您还可以删除返回值的冗余(并且可能是危险的)强制转换,因此:
int **est = ( int** ) idp_to_2d ( rows , cols ) ;
Run Code Online (Sandbox Code Playgroud)
只会是:
int **est = idp_to_2d ( rows , cols ) ;
Run Code Online (Sandbox Code Playgroud)