分配,释放,分配变量

Allocate, free, allocate variable

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

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);
}

它不起作用。最后,如果我在循环中取出 gsl_matrix * ,它就会起作用。例如

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

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

您的编译器应该给您一个警告并提示解释 - 某些效果是在循环内重新声明的变量 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