2012-12-02 27 views
3

我試圖找出爲什麼即使局部變量我在這個C程序中是從來沒有intialized,許多系統會打印出0 1 2 3 4 5 6 7 8 9有人能解釋這是爲什麼?任何幫助表示讚賞!爲什麼C中的未初始化的變量仍然產生輸出

void foo() { 
    int i; 
    printf("%d ", i++); 
} 
int main() { 
    int j; 
    for (j = 1; j <= 10; j++) foo(); 
} 
+1

在我的系統上,它給出了'134513713 134513714 134513715 134513716 134513717 134513718 134513719 134513720 134513721 134513722'。所以,它可以或不可以通過0 1 2等。 – axiom

+4

每個答案都歸因於運氣。你必須是一個真正的幸運者:) – asheeshr

+0

是的,我開始接觸,也許我只是知道合適的人:) –

回答

7

該行爲是未定義的。統計數據無關緊要。這可能是由於堆棧的佈局和初始化,但也可能是出於其他原因。

例如,假設:

  1. 沒有檢查,如果變量初始化。
  2. 這是一個簡單的堆棧機器。
  3. 堆棧初始化爲0.
  4. 變量i在堆棧上分配,而不是寄存器。
  5. 當函數被調用時,它不會初始化堆棧。

在這種情況下將i指代相同的地方在堆棧上的每個時間,將開始爲0,在堆棧上的同一位置將由一個每次遞增。

+0

謝謝,這樣做很有意義並且很有幫助 –

3

可變i是在棧中創建和你沒有初始化它。所以它包含了一些你無法預測的垃圾值。幸運的是,在你的情況下,垃圾值最初爲0。如果在另一個系統上運行,則會得到一組不同的值。行爲是肯定的。

因爲除非在for循環中調用該函數,否則不會執行任何操作,幸運的是,該變量i每次都會被銷燬並重新分配相同的內存空間。所以它在迭代中也保持其價值。

在我的系統它給這些值。

2009288233 
2009288234 
2009288235 
2009288236 
2009288237 
2009288238 
2009288239 
2009288240 
2009288241 
2009288242 
2

這可能是因爲該函數中的局部變量反覆被分配並從相同的內存塊中釋放。這就是爲什麼輸出重複遞增的原因。

的初值爲零是運氣。它可能是其他任何垃圾值。

行爲是不確定的,並不會在另一個系統上運行。

0

由於這是一個簡單的程序,你是幸運的,同樣的內存位置使用我的。由於這不是初始化的,它會提取以前的值。

然而,這是不確定的。應該用警告來編譯它來挑選這個bug。

0

正如其他人指出,這是不確定的行爲,所以沒有堅實的答案。

這就是說,你可能是正確的,你會得到最常用的值是0到9這會發生,因爲OS清零內存由堆佔據你的程序接受它。 foo()表示一直在做的最深的調用,所以它的使用後,OS清零,所以在第一次通話,這是相當有可能仍包含零還未觸碰內存。

在每次後續調用時,它可能會佔用堆棧中的相同位置,因此在每次後續調用的開始時,可​​能會以先前調用結束時的值開始。

正弦它是未定義的行爲,根本沒有任何保證,但是,可能至少有一點可能比沒有。