为什么12位未初始化的int变量总是为0xff0?

时间:2012-12-07 17:20:28

标签: c gcc

当我尝试向朋友解释一些简单的代码时,会发生一些奇怪的事情:

#include <stdio.h>
int main() 
{
    int x;
    printf("%x\n",x);
}

我已经尝试了数百万次,x的最后12位总是变成0xff0。 我已经解除了代码,但仍然无法弄清楚这里发生了什么

我的操作系统是ubuntu10.10,编译器是gcc4.7.2

4 个答案:

答案 0 :(得分:6)

读取未初始化的变量是未定义的行为。所以你什么都不保证。

这包括始终为零,始终保持平衡,始终不同,并重新格式化您的硬盘。

答案 1 :(得分:4)

首先,如果值始终与0xFF0匹配,则“低12位”是该值,而不是低3位。

至于为什么会发生这种情况,您正在读取一个尚未初始化的变量。这是未定义的行为,当你试图这样做时,任何事情都可能发生,从崩溃到披萨交付。

实际发生的是:x引用的位置具有之前保存的一些数据。有可能在您的设置中,该变量恰好包含低12位为0xFF0的数据;在这种情况下,在调用main之前系统完成的处理工作期间,很可能是与先前系统调用相关联的数据。

简而言之:在使用变量之前初始化变量,不要问为什么未初始化变量具有它们所具有的价值。

答案 2 :(得分:2)

值始终相同,因为您的程序是 deterministic

未初始化变量的值是正式“未定义”,但在一个总是经历完全相同步骤的程序中,它可能是可预测的。在这种情况下,事实证明,无论在main之前使用该寄存器还是堆栈槽,您需要看到的值。

程序不确定性的唯一时间是它是否与非确定性的其他东西(例如用户,可更改的文件或网络)交互。然而,线程程序可能是非确定性的,没有任何外部刺激。

答案 3 :(得分:0)

  

我发现它不仅仅是偶数,最后3位总是

也许存储在堆栈中该位置的前一个东西是指向堆分配内存的指针的值,或类似的东西(堆分配的块通常舍入到边界,例如8字节边界)。