C 分配,释放,分配变量

C 分配,释放,分配变量,c,malloc,gsl,C,Malloc,Gsl,我正在使用GSL库编写一些C代码。我注意到在使用GSL库分配、释放和分配代码中的变量时存在某种不一致性(至少从我有限的C语言知识来看)。当第一次分配在循环内时,一切正常,例如 int i; for(i=1; i < 101; i++){ gsl_matrix * W = gsl_matrix_alloc(10,10); gsl_matrix_free(W); } 有人有解释吗?为什么第一次分配的位置在循环内部或外部很重要?您的编译器应该给您一个警告,并给出一个解释提示-大意是在循

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

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

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

您的编译器应该给您一个警告,并给出一个解释提示-大意是在循环内部重新声明的变量
W
隐藏了在循环外部声明的变量
W

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

从第二行中删除
gsl\u矩阵*
,会按照预期重新赋值,因此代码会再次工作

请注意,
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
gsl_矩阵*W=gsl_矩阵alloc(10,10);
对于(i=1;i<101;i++){
gsl_矩阵_自由(W);
W=gsl_矩阵_alloc(10,10);//重新赋值
}
gsl_矩阵_自由(W);//避免内存泄漏
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);
}
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