为什么 printf 不打印垃圾值?
Why printf is not printing garbage value?
#include<stdio.h>
void foo(){
int i;
printf("%d\n",i); //should print garbage value
}
void main(){
foo();
}
foo
应该打印 i
的垃圾值。但它正在打印零。这是为什么?我正在使用 gcc 版本 4.9.2.
您的程序表现出未定义的行为,因此有 任何 期望都是错误的;它在这里打印零是完全有效的。
其实,这并不是特别出乎意料。当你的程序启动时,它的所有内存只包含零(这取决于你的 OS,当然,但可能是真的),所以当你将堆栈扩展到 space 时,或者为第一次,那么你会得到零值。
当一个(非平凡的)程序运行时,它会扩展和收缩堆栈,分配和释放部分堆,内存逐渐收集大量非零垃圾。如果您将 foo()
作为真实项目的一部分调用,您可能会认为垃圾值会随时间变化。
当然,在您的简单示例中,优化编译器可能会注意到该值未初始化,发出警告,并且不会费心从内存中加载任何内容,在这种情况下,您的垃圾值可能来自寄存器。现在为零的可能性取决于调用 foo()
的上下文;如果呼叫者对某事使用零,您可能发现来自该站点的呼叫将始终打印零。
总而言之,未定义的行为是未定义的,可能会随着程序的运行时间而变化,可能会因编译器、编译器优化级别而异,并且可能会在调整明显无关的代码时发生变化。
#include<stdio.h>
void foo(){
int i;
printf("%d\n",i); //should print garbage value
}
void main(){
foo();
}
foo
应该打印 i
的垃圾值。但它正在打印零。这是为什么?我正在使用 gcc 版本 4.9.2.
您的程序表现出未定义的行为,因此有 任何 期望都是错误的;它在这里打印零是完全有效的。
其实,这并不是特别出乎意料。当你的程序启动时,它的所有内存只包含零(这取决于你的 OS,当然,但可能是真的),所以当你将堆栈扩展到 space 时,或者为第一次,那么你会得到零值。
当一个(非平凡的)程序运行时,它会扩展和收缩堆栈,分配和释放部分堆,内存逐渐收集大量非零垃圾。如果您将 foo()
作为真实项目的一部分调用,您可能会认为垃圾值会随时间变化。
当然,在您的简单示例中,优化编译器可能会注意到该值未初始化,发出警告,并且不会费心从内存中加载任何内容,在这种情况下,您的垃圾值可能来自寄存器。现在为零的可能性取决于调用 foo()
的上下文;如果呼叫者对某事使用零,您可能发现来自该站点的呼叫将始终打印零。
总而言之,未定义的行为是未定义的,可能会随着程序的运行时间而变化,可能会因编译器、编译器优化级别而异,并且可能会在调整明显无关的代码时发生变化。