教程里说
如果您使用 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/