首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C中块作用域的变量声明后使用goto

在C中块作用域的变量声明后使用goto
EN

Stack Overflow用户
提问于 2019-03-27 08:33:45
回答 2查看 283关注 0票数 3

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

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

代码语言:javascript
复制
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");

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-27 08:52:14

不可能确定答案;然而,大多数编译器一次为函数分配所有内存。

作为一个实际问题,如果它超出了作用域,那么访问指向它的指针就不是一个好主意,否则你就不会关心它。即使在-O0中,超出作用域的变量的内存也可能被重用。

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

票数 4
EN

Stack Overflow用户

发布于 2019-03-27 08:55:37

在使用GCC或MSVC的基于堆栈的处理器(如x86 )的情况下,所有本地变量的堆栈空间将在进入函数foo时保留,而不考虑范围。无论退出是如何到达的,堆栈帧都将在退出时展开,并按预期回收堆栈空间。

然而,对于C++来说,情况就不同了。不完全是你的例子,但是如果你跳过一个构造函数,那么构造函数将不会运行,但是编译器仍然会运行析构函数,这会导致混乱。幸运的是,正如Joshua在评论中指出的那样,现代编译器检测到这种情况,并将生成编译时错误来避免这种情况。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55368125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档