c - goto 和 c 中的自动变量初始值设定项

标签 c

教程里说

如果您使用 goto 语句跳转到 block 的中间,则该 block 内的自动变量不会被初始化。

那么在下面的代码中,如果可以访问/声明 i 那么为什么它没有被初始化?

int main()
{
   goto here;
   {
     int i=10;
     here:
      printf("%d\n",i);
   }
   return 0;
}

ps:输出是一些垃圾值。

最佳答案

您的问题“如果 i 可以访问,为什么...”背后没有逻辑。能够“访问i”并不是支持或反对任何事情的理由。它只是意味着 printf 语句与 i 在同一范围内。但是,由于您跳过了初始化程序,因此变量未初始化(正如您的教程所说)。

读取未初始化的变量是未定义的行为,因此您的程序格式错误。

变量 i 的内存已经在编译时预留,因为已知该变量存在于内部 block 中。内存不会像您想象的那样动态分配。它已经存在,但由于 goto,它从未被设置为任何确定的值。

经验法则:不要跳过初始值设定项。

关于c - goto 和 c 中的自动变量初始值设定项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11447634/

相关文章:

可以仅使用 C 来利用 Windows API 吗?

c - WDK : get processId by name. 可执行文件

javascript - 使用 Objective-C 将 JSON 解析为 C 风格的字符数组

c - 无法将完整脚本写入串行端口上的设备

c - 如何创建一个函数来解密加密文件?

c - 单元测试环境中的模拟/伪造静态函数

c - 将 sizeof 与 char *array[] 一起使用

c - C 中的错误;方法分割错误

c - 缩进很奇怪——修复或选择一个替代方案

c - 使用libxls在C中读取excel文件