在switch语句块中声明的自由变量

时间:2018-02-19 01:22:27

标签: c

我有一个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);

2 个答案:

答案 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都有自己的块,所以指针不能从该块外部释放。

有几种方法可以解决这个问题。例如,您可以释放每个开关盒末尾(在中断之前)的指针,或者您可以在开关之前声明指针变量,这样就可以从外部看到它。