2012-12-07 115 views
1

當我試圖解釋一些簡單的代碼給我的朋友,奇怪的事情發生:爲什麼12位未初始化的int變量總是0xff0?

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

我已經tryed數百萬次,x的最後12位,始終原來是量0xFF0。 我已經disass的代碼,但仍無法弄清是怎麼回事

我的操作系統是ubuntu10.10,編譯器是gcc4.7.2

+2

它只是平均,還是4或8的倍數? – ChrisW

+1

這個問題爲什麼關閉?這是一個有效的編程問題,只需一個簡單的答案? –

+0

@ChrisW我發現它不只是偶數,最後3位總是變成0xff0。我編輯了我的問題。謝謝! – FooBee

回答

4

首先,如果該值總是匹配量0xFF0那麼「低12位」是價值,而不是低3

至於爲什麼會出現這種情況,你正在閱讀的變量,你的天堂」初始化。這是未定義的行爲,當你試圖做到這一點時,發生任何事情,從碰撞到披薩交付。

究竟發生了什麼是這樣的:x引用的位置有一些它以前保存的數據。有可能在你的設置中,該變量恰好包含其低12位爲0xFF0的數據;在調用main之前,在系統完成的處理工作期間,最有可能的數據與以前的系統調用相關聯。

長話短說:在使用它們之前初始化變量,不要問爲什麼未初始化的變量具有它們所做的值。

6

讀取未初始化的變量是不確定的行爲。所以你一無所獲。

這包括始終爲零,始終均勻,總是不同,並重新格式化硬盤驅動器。

+10

一個未初始化的變量曾經與我的女朋友跑了。真實的故事。 – JasonD

+1

@JasonD - 我有把握,我很確定。 –

2

該值始終相同,因爲您的程序是確定性

未初始化變量的值是正式「未定義」的,但是在總是經歷完全相同步驟的程序中,它可能是可預測的。在這種情況下,事實證明,無論在main之前使用那個寄存器或堆棧槽需要你看到的值。

程序不會確定性的唯一時間是它是否與非確定性的其他內容(如用戶,可更改文件或網絡)進行交互。但是,一個線程化程序可能是非確定性的,沒有任何外部刺激。

0

我發現它不只是甚至,最後3位,總是被證明是

也許這是存儲在堆棧上的該位置之前的事情是一個指向堆的價值 - 分配的內存或類似的東西(堆分配的塊通常被舍入到邊界,例如8字節的邊界)。