0 c gcc default undefined-behavior garbage
#include<stdio.h>
void foo(){
int i;
printf("%d\n",i); //should print garbage value
}
void main(){
foo();
}
Run Code Online (Sandbox Code Playgroud)
foo应打印垃圾值i.但相反,它打印为零.这是为什么?我使用的是gcc版本4.9.2.
你的程序演示了未定义的行为,所以有任何期望是错误的; 在这里打印零是完全有效的.
事实上,这并非出乎意料.当你的程序启动它的所有内存只包含零(这当然取决于你的操作系统,但可能是真的),所以当你将堆栈扩展到那个空间,或者第一次分配堆内存时,你会得到零值.
当一个(非平凡的)程序运行时,它扩展和收缩堆栈,分配和释放堆的部分,并逐渐地收集大量的非零垃圾.如果您foo()作为真实项目的一部分进行了调用,那么您可能希望垃圾值随时间而变化.
当然,在您的简单示例中,优化编译器可能会注意到该值未初始化,发出警告,并且不打扰从内存加载任何内容,在这种情况下,您的垃圾值可能来自寄存器.这个为零的可能性现在取决于foo()所调用的上下文; 如果调用者使用零值,您可能会发现该站点的调用始终为零.
总之,未定义的行为是未定义的,并且可能在程序的运行时间内有所不同,并且可能在编译器之间,编译器优化级别之间有所不同,并且在调整明显不相关的代码时可能会发生变化.
| 归档时间: |
|
| 查看次数: |
230 次 |
| 最近记录: |