首页 > 解决方案 > 在 C 中的块范围内声明变量后使用 goto

问题描述

我试图更好地理解 C 中的块作用域,以及标准是否提供了关于在退出块作用域时弹出堆栈元素的任何保证,这些元素可能在进入该作用域时被推入堆栈。例如,在块内声明变量后跳转到块外的标签(这只是跳转到 C 中的标签,没什么特别的)会导致堆栈损坏吗?

这是一个人为的例子,如果它有助于进一步定义问题,假设-O0. 我的困惑是err2当跳转到fatal标签的执行路径被命中时是否从堆栈中弹出。因为标签在 C 中没有什么特别之处,所以我假设它err2没有从堆栈中弹出,并且会导致堆栈损坏。

void foo() 
{

    int err;
    if (err = baz()) {

        printf("error %i", err);
        int err2;
        if (err2 = another_thing())
            goto fatal;

    } 

    printf("done");
    return;

fatal:

    printf("there was a fatal error");

}

标签: cgoto

解决方案


无法肯定回答;然而,大多数编译器一次为函数分配所有内存。

实际上,如果它超出范围,访问指向它的指针是一个坏主意,否则你不在乎。即使在-O0,可能会重用范围外变量的内存。

在任何情况下,局部变量都不会泄漏。堆栈不会变得不平衡。问题中的代码没有任何危险。


推荐阅读