我有一个switch语句,它在每个case块中声明了不同的变量。我想在例程结束时释放这些变量,但编译器抛出一个错误,标识符“变量名称”未定义。我不想在switch语句之前声明这些变量。我该如何解决这个错误?这是伪代码:
int CaseType;
switch(CaseType){
Case 1:
{
double *a = malloc(100 * sizeof(double));
<< some operation here >>
break;
}
Case 2:
{
double *b = malloc(200 * sizeof(double));
<< some operation here >>
break;
}
}
if (CaseType == 1) free(a);
if (CaseType == 2) free(b);
答案 0 :(得分:4)
关于代码:
case 1:
{
double *a = malloc(100 * sizeof(double));
<< some operation here >>
break;
}
a
的生存期完全在大括号{}
指定的块内。该块后面不存在该对象。
在同一范围内(即紧接在break
之前)释放变量更为正常:
case 1: {
double *a = malloc(100 * sizeof(double));
<< some operation here >>
free(a);
break;
}
但是,如果您想在其他时间之后使用它,那么您可以在括号之前创建对象,以便以后可以访问它们,例如:
double *a = NULL, *b = NULL;
switch(CaseType){
case 1: {
a = malloc(100 * sizeof(double));
<< some operation here >>
break;
}
case 2: {
b = malloc(200 * sizeof(double));
<< some operation here >>
break;
}
}
// Do something with a and/or b, ensuring they're not NULL first.
free(a); // freeing NULL is fine if you haven't allocated anything.
free(b);
顺便说一下,你应该总是认为失败的调用(如malloc
)将在某些时候失败并相应地编码。我将怀疑这些代码存在于<< some operation here >>
部分: - )
答案 1 :(得分:3)
变量只能在它们声明的代码块中引用。因为每个switch case都有自己的块,所以指针不能从该块外部释放。
有几种方法可以解决这个问题。例如,您可以释放每个开关盒末尾(在中断之前)的指针,或者您可以在开关之前声明指针变量,这样就可以从外部看到它。