c - 在 C 中的 block 范围内的变量声明之后使用 goto

标签 c goto

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

这是一个人为的例子,如果它有助于进一步定义问题,假设-O0。我的困惑是当跳转到 fatal 标签的执行路径被击中时,err2 是否从堆栈中弹出。因为标签在 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 处,超出范围的变量的内存也可能会被重用。

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

关于c - 在 C 中的 block 范围内的变量声明之后使用 goto,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55368125/

相关文章:

c++ - 如何使用 salsa20(或 ChaCha)?

从 C 中的数组创建一个没有重复整数的新数组

c - 用8位指针写入,用32位指针读取

c - 如何优化 C for 循环?

c# - GoTo 的可接受使用?

goto的C用法

c - gets() 函数从第二次开始被跳过

c - 如何捕获SIGINT并在子进程中忽略它?

C# 拼图 : Reachable goto pointing to an unreachable label

c++ - 将 goto 标签暴露给符号表