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

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

关于如下代码:

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 >>怀疑,这些代码存在于<< some operation here >>部分:-)


变量只能在声明它们的代码块中引用。由于每个开关情况都有自己的块,指针不能从该块外部释放。

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

链接地址: http://www.djcxy.com/p/84401.html

上一篇: Free variables that are declared inside switch statement blocks

下一篇: Why break cannot be used with ternary operator?