下面的简单C程序输出42
令我惊讶。我期望它输出垃圾值或0
,因为堆栈帧foo()
和bar()
不同。输出如何确定为42
?调用堆栈在2个函数调用之间重复使用
#include <stdio.h>
void foo(void){
int a;
printf("%d\n",a);
}
void bar(){
int a=42;
}
int main(){
bar();
foo();
return 0;
}
>>gcc -o test test.c
>>./test
42
当我指示编译器优化的代码,它打印的垃圾!
>>gcc -O -o test test.c
>>./test
2487239847
这是** **不确定性。您调用_undefined behaviour_。该代码可以格式化您的硬盘。 **您期望哪个**“垃圾值”? – Olaf
垃圾值恰好在'foo()'堆栈中的位置,其中将存储变量'a'。请参阅编辑的问题。当我优化编译器时,它会打印垃圾。 –
你的C书应该包含一个关于未定义行为的警告。 **阅读**。所以当我读你的评论时,除**'42'之外的任何值都是垃圾。撇开该程序不需要打印任何东西。 – Olaf