分配,免费,分配变量

时间:2017-10-04 16:44:39

标签: c malloc gsl

我正在使用GSL库编写一些C代码。我在使用GSL库在代码中分配,释放和分配变量时,注意到某种不一致(至少来自我对C的有限知识)。当第一次分配在循环内部时,一切正常,例如

list_status
# JavaObject id=o40

在另一个函数中,我在循环之前进行了初始分配,

int i;
for(i=1; i < 101; i++){
  gsl_matrix * W = gsl_matrix_alloc(10,10);
  gsl_matrix_free(W);
}

并且它不起作用。最后,如果我在循环中取出int i; gsl_matrix * W = gsl_matrix_alloc(10,10); for(i=1; i < 101; i++){ gsl_matrix_free(W); gsl_matrix * W = gsl_matrix_alloc(10,10); } ,它就可以了。 E.g。

gsl_matrix *

有没有人有解释?为什么第一个分配在循环内部或外部的位置很重要?

1 个答案:

答案 0 :(得分:2)

你的编译器应该给你一个警告,提示解释 - 在循环中重新声明的变量W隐藏了在循环外声明的变量W

第二个循环不起作用的原因是您重新声明W,而不是重新分配它。这就是为什么只有第一次迭代才能正确释放矩阵W;后续迭代释放悬空指针,导致未定义的行为。

从第二行删除gsl_matrix *会使其成为预期的重新分配,因此代码可以再次运行。

注意W指向最后分配的矩阵,需要释放它以避免内存泄漏:

gsl_matrix * W = gsl_matrix_alloc(10,10);
for(i=1; i < 101; i++){
    gsl_matrix_free(W);
    W = gsl_matrix_alloc(10,10); // re-assign
}
gsl_matrix_free(W); // Avoid memory leaks