C内存分配和释放

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)

  • 我还要提到他没有检查来自`malloc`的`NULL`返回 (2认同)