c - 为什么 printf 不打印垃圾值?

标签 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 版。

最佳答案

您的程序表现出未定义的行为,因此有任何期望都是错误的;它在这里打印零是完全有效的。

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

当一个(非平凡的)程序运行时,它会扩展和收缩堆栈,分配和释放部分堆,内存逐渐收集大量非零垃圾。如果您在实际项目中调用了 foo(),您可能会认为垃圾值会随时间变化。

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

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

关于c - 为什么 printf 不打印垃圾值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30526789/

相关文章:

WPF 按钮文字环绕样式

css - 默认情况下,页面中的溢出自动应用于 HTML 或 BODY 吗?

c++ - 寻找最小字典顺序数组

c - 如何在 C 中释放一些动态分配的嵌套结构数组?

c - 如何执行 gcc 并忽略某些语法

python - 为什么我不能在Centos 5.5下安装Python 2.7?

c++ - 为什么我的 C++ 子类需要显式构造函数?

c - strace如何读取系统调用sys_open的文件名?

c - fgets() 错误 : "No source available for..."

c - GCC 不提示未初始化的变量