【问题标题】:Why printf is not printing garbage value?为什么 printf 不打印垃圾值?
【发布时间】:2015-05-29 10:06:12
【问题描述】:
#include<stdio.h>

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

void main(){
  foo();
}

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

【问题讨论】:

  • 零也可能是垃圾值。
  • 调试构建 --> 分配的内存填充为零?使用发布配置检查它。并且 int 在堆栈上.. 使用 new 创建一个 int 数组
  • 在某些(想象的)架构上,编译您的代码可能会将天花板涂成黄色......并生成一个可执行文件,运行时会将您银行帐户中的钱转移到我的帐户中。

标签: c gcc default undefined-behavior garbage


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    • 2016-04-15
    • 2023-03-25
    相关资源
    最近更新 更多