在一个教程中它说
如果使用goto语句跳转到块的中间,则不会初始化该块中的自动变量.
然后在下面的代码中,如果我可以访问/声明,那么为什么它没有初始化?
int main()
{
goto here;
{
int i=10;
here:
printf("%d\n",i);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
ps:输出是一些垃圾值.
你的问题背后没有逻辑"如果i可以访问,为什么......".能够"访问i"不是支持或反对任何事情的论据.它只是意味着该printf声明与...相同i.但是,由于您跳过了初始化程序,因此该变量未初始化(正如您的教程所述).
读取未初始化的变量是未定义的行为,因此您的程序格式不正确.
变量的内存i已经在编译时被搁置,因为已知变量存在于内部块内.正如您可能想象的那样,内存不会动态分配.它已经存在,但它从来没有被设置为任何确定因为goto.
经验法则:不要跨越初始化器.