2015-05-14 108 views
4

我写了下面的C函数,它在必要的内存分配后返回一个双指针。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 ; 
} 

然后我收到使用下面的代码this指针从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.2OS的Ubuntu 15.04(64位),我使用NetBeans IDE的8.0.2

+5

用[*未定义行为*](http://en.wikipedia.org/wiki/Undefined_behavior)的问题是,它可能会* *似乎工作没关系,和你有不确定的行为,当你走超出分配内存的界限。 –

回答

11

您的循环是错误的 - 你迭代一个太多行 - 变化:

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) ; 
+1

你甚至不应该在C中使用void指针 –

+0

@ErikW:很好。 –

+0

@ErikW:'void ** est;'没有定义一个'void'指针。 – alk