为什么printf不打印垃圾值?

时间:2015-05-29 10:06:12

标签: c gcc default undefined-behavior garbage

#include<stdio.h>

void foo(){
  int i;
  printf("%d\n",i);  //should print garbage value
}

void main(){
  foo();
}

foo应打印i的垃圾值。但相反,它打印为零。这是为什么?我使用的是gcc版本4.9.2。

1 个答案:

答案 0 :(得分:5)

您的程序演示了未定义的行为,因此任何期望是错误的;在这里打印零是完全有效的。

事实上,这并非出乎意料。当你的程序启动它的所有内存只包含零(这当然取决于你的操作系统,但可能是真的),所以当你将堆栈扩展到那个空间,或者第一次分配堆内存时,你会得到零值。

当一个(非平凡的)程序运行时,它会扩展和缩小堆栈,分配和释放堆的部分内容,并逐渐收集大量非零垃圾。如果您已将foo()作为实际项目的一部分进行调用,那么您可能希望垃圾值随时间而变化。

当然,在您的简单示例中,优化编译器可能会注意到该值未初始化,发出警告,并且不打扰从内存加载任何内容,在这种情况下,您的垃圾值可能来自寄存器。这个为零的可能性现在取决于调用foo()的上下文;如果调用者对某事使用零,则可能发现来自该站点的调用将始终为零。

总之,未定义的行为是未定义的,并且可能因程序的运行时而异,并且可能在编译器之间,编译器优化级别之间有所不同,并且在调整明显不相关的代码时可能会发生变化。