已声明的变量与goto中的goto的交互

时间:2016-11-02 11:42:19

标签: c c99 goto

所以,假设你有理由使用goto ...只是为了避免关于为什么应该/不应该使用它们的不可避免的争论。

当你声明一个变量mid函数时会发生什么,比如一个指向一些必须被释放的内存的指针,并且流量控制完全跳过该变量?

int foo(char* bar)
{
    if (NULL == bar)
    {
        printf("ERR1\n");
        goto out;
    }

    char* late = malloc(10 * (*bar));
    if (NULL == late)
    {
        printf("ERR2\n");
        goto out;
    }

    // More logic here
    if (1)
    {
        printf("ERR3\n");
        goto out;
    }

    // etc

out:
    free(late);
    return 0;
}

有些情况下,在'out:'中,你肯定想要释放分配给变量'late'的内存(例如它掉落或来自'ERR3')。在函数的早期也有一些情况,即使还没有创建迟到,你跳过它们。

通常,在声明这样的局部变量时,在汇编中,有一些堆栈操作可以移动堆栈指针以获得容纳新变量的空间。我希望goto对标签的无条件分支操作起作用。在函数结束时,当堆栈指针被调整时,所有本地成员都会离开堆栈,因此控制权可以返回给调用者。

那么,当我们点击'ERR1'时,'late'变量会发生什么?是否在堆栈上创建了空间? “免费”通话如何在“结束”标签之后工作?

0 个答案:

没有答案