C语言goto跳转后输出垃圾值 为何结果不是10也不是5?
C语言goto跳转到内部块输出垃圾值原因说明
你提供的示例代码如下:
void main() { int a=10; goto here; { int a=5; here: printf("%i",a); } }
核心原因分为两点:
- 同名变量遮蔽规则:你在内部嵌套代码块中定义了和外层同名的变量
a,在内部代码块的作用域范围内,内层a会完全覆盖外层a的可见性,编译器解析内部代码块里的a时,只会匹配到内层定义的局部变量,不会访问到外层值为10的a。 - goto跳过了内层变量的初始化流程:C语言的块级局部变量只会在进入块后执行到对应的定义赋值语句时才会完成初始化,你通过
goto直接跳转到块内标签位置,完全跳过了int a=5;这行初始化代码。此时内层a已经分配了栈内存空间,但内存中存储的是栈区域遗留的随机数据,属于未初始化变量的读取行为,是C标准规定的未定义行为,输出结果自然就是随机的垃圾值。
内容的提问来源于stack exchange,提问作者Spark
相关产品推荐
相关产品推荐

