g中的goto和自动变量初始化程序

Dha*_*tri 6 c

在一个教程中它说

如果使用goto语句跳转到块的中间,则不会初始化该块中的自动变量.

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

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

ps:输出是一些垃圾值.

Ker*_* SB 9

你的问题背后没有逻辑"如果i可以访问,为什么......".能够"访问i"不是支持或反对任何事情的论据.它只是意味着该printf声明与...相同i.但是,由于您跳过了初始化程序,因此该变量未初始化(正如您的教程所述).

读取未初始化的变量是未定义的行为,因此您的程序格式不正确.

变量的内存i已经在编译时被搁置,因为已知变量存在于内部块内.正如您可能想象的那样,内存不会动态分配.它已经存在,但它从来没有被设置为任何确定因为goto.

经验法则:不要跨越初始化器.

  • @Hiett:如果它有助于记住发生了什么,变量声明*不是C语法中的语句*.块中的所有声明都有助于编译器理解当代码进入该块时它需要在堆栈上提供什么空间,这就是为什么在C89中它们必须在块的开头,在任何语句之前.这些变量的初始化器和赋值与某些(例如)4个字节的自动变量被调用的知识分开处理. (3认同)