2015-05-29 119 views
0
#include<stdio.h> 

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

void main(){ 
    foo(); 
} 

foo应该打印垃圾值i。但是,它正在打印零。这是为什么?我使用的是gcc版本4.9.2。为什么printf不打印垃圾值?

+6

零也可能是垃圾值。 – jangler

+0

调试构建 - >分配的内存填充零?检查它与发布配置。并且int在堆栈中。使用new创建一个int数组 –

+0

在一些(虚构)架构上,编译代码可能会使天花板变黄......并生成一个可执行文件,当运行该文件时会将银行帐户中的资金转移到我的。 – pmg

回答

5

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

事实上,这并不是非常意外。当你的程序启动时,它的所有内存都只包含零(这取决于你的操作系统,当然这可能是真的),所以当你将堆栈扩展到这个空间或者第一次分配堆内存时,你会得到零值。作为一个(非平凡的)程序运行,它扩展和缩小堆栈,分配和释放堆的一部分,并逐渐地收集大量的非零垃圾。如果您将foo()称为真实项目的一部分,则可能会期望垃圾值随时间而变化。

当然,在你的小例子中,一个优化编译器可能会注意到这个值是未初始化的,会发出警告,并且不会打扰从内存中加载任何东西,在这种情况下,垃圾值可能来自寄存器。这是零的机会现在取决于调用foo()的上下文;如果主叫方使用某个零值,您可能会可能发现来自该网站的呼叫将始终打印零。总之,未定义的行为是未定义的,并且可能随程序的运行时间而变化,并且可能因编译器而不同,在编译器优化级别之间有所不同,并且在调整明显不相关的代码时可能会发生变化。