C内存分配和释放

标签 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 ;
}

然后我使用来自 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.2OSUbuntu 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/

相关文章:

c - 使用 Expert Advisor MQL5 在指标窗口上绘制垂直线的最简单方法

c - scanf() 将换行符保留在缓冲区中

c - 当您对现有变量调用 malloc 时会发生什么?

C++,泄漏与否?可以做什么

c - for循环中的malloc

c - 检测人脸并将检测到的人脸保存在 OpenCV 中

python - 重新排序数组中的值对,使它们按顺序排列

c - C程序运行时错误

c - 尝试复制 malloc 时遇到段错误问题

c# - c#访问内存地址