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不打印垃圾值?
#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不打印垃圾值?
你的程序演示了未定义的行为,因此有任何期望是错误的;它在这里打印零点完全有效。
事实上,这并不是非常意外。当你的程序启动时,它的所有内存都只包含零(这取决于你的操作系统,当然这可能是真的),所以当你将堆栈扩展到这个空间或者第一次分配堆内存时,你会得到零值。作为一个(非平凡的)程序运行,它扩展和缩小堆栈,分配和释放堆的一部分,并逐渐地收集大量的非零垃圾。如果您将foo()
称为真实项目的一部分,则可能会期望垃圾值随时间而变化。
当然,在你的小例子中,一个优化编译器可能会注意到这个值是未初始化的,会发出警告,并且不会打扰从内存中加载任何东西,在这种情况下,垃圾值可能来自寄存器。这是零的机会现在取决于调用foo()
的上下文;如果主叫方使用某个零值,您可能会可能发现来自该网站的呼叫将始终打印零。总之,未定义的行为是未定义的,并且可能随程序的运行时间而变化,并且可能因编译器而不同,在编译器优化级别之间有所不同,并且在调整明显不相关的代码时可能会发生变化。
零也可能是垃圾值。 – jangler
调试构建 - >分配的内存填充零?检查它与发布配置。并且int在堆栈中。使用new创建一个int数组 –
在一些(虚构)架构上,编译代码可能会使天花板变黄......并生成一个可执行文件,当运行该文件时会将银行帐户中的资金转移到我的。 – pmg