在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");

}
约书亚记

无法肯定地回答;但是,大多数编译器会一次为该函数分配所有内存。

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在C和C ++中,“变量未在此范围内声明”

在C ++中的给定相同范围内声明相同的变量名称

在类范围内声明时,如何在C ++ 14中引用变量模板?

在块内使用 main 中声明的变量

错误:未在此范围内使用C ++声明

C ++-函数范围内的函数声明?

变量-未声明(或其声明不在范围内)

使用防护的函数中变量不在范围内错误

C#-在“封闭”局部范围内使用变量?

评估Kotlin中的代码块(将变量隐藏在范围内)

为什么在“捕获”或“最终”范围内的“尝试”中未声明变量?

在 bash 中声明 -u 是否也会使变量在本地范围内?

Arduino-在setup()中声明的变量不在函数范围内

尽管在类中声明了变量,但无法在范围内找到

C++ switch 语句错误(变量未在此范围内声明)

C ++编译错误构建arduino项目:在此范围内未声明变量

我可以在块范围内强制转换变量吗?

为什么要使用extern关键字在命名空间范围内声明变量?

未在此范围内声明的Opencv变量

如何查找在局部范围内声明的变量的地址?

未在此范围内声明的Modelica变量

未在此范围内声明变量gcc错误

错误:变量未在此范围内声明

在Excel范围内使用变量

对变量使用范围内的值

范围内的变量

Extern 声明跟在同一范围内的非 extern 声明之后

在C ++中的本地范围内使用Lambda

在Java的静态块内声明的变量的范围是什么?