转到后的堆栈状态

时间:2016-06-20 12:52:01

标签: c stack goto

在以下C代码中,f拨打gg拨打h。请注意goto中的h:如果f满足某个条件,它将跳回a

void h(int a)
{
    if (a > 10)
        goto out;
}

void g(int a, int b)
{
    h(a);
}

void f(int a, int b)
{
    g(a, b);
    return;
out:
    printf("b: %d\n", b);
}

我的问题是:如果goto被触发,堆栈将如何? gh会被取消堆叠吗?并且f仍会打印b的正确值吗? (或者只有在我幸运的情况下,它会打印出来吗?)

(请,我不想讨论这是不是一个好的做法,或者是否应该使用它。另外,请考虑实际的代码是否足够复杂,以便编译器不够聪明到,例如,优化g out)

[我可以详细说明为什么我这样做,如果重要 - 我认为不这样做]

4 个答案:

答案 0 :(得分:4)

问题是无效的,因为它不能像这样完成:你只能在一个函数中goto,而不能在函数之间。

要在功能之间跳转,您可以使用setjmp / longjmp

答案 1 :(得分:4)

这将导致标准C中的未定义行为。

C Language Standard的6.8.6.1/1:

  

goto语句中的标识符应指定位于的标签   在封闭功能的某个地方。 goto语句不得跳转   来自具有可变修改的标识符范围之外的   键入到该标识符范围内。

答案 2 :(得分:1)

C编程中的goto语句提供了来自' goto'的无条件跳转。标记声明在同一个函数中

标签是单个函数的本地标签,您不能在不同的函数之间跳转。

注意 - 在我看来,强烈建议不要使用goto语句。

参考:http://www.tutorialspoint.com/cprogramming/c_goto_statement.htm

答案 3 :(得分:-1)

您不能这样做,因为标签是每个特定功能的本地标签。但是,最接近的标准等价物是setjmp()和longjmp()函数对。这应该工作。 :)