2013-01-02 85 views
0
#include <stdio.h> 

int main(void) 
{ 

    int values[10]; 
    int index; 

    values[0] = 197; 
    values[2] = -100; 
    values[5] = 350; 
    values[3] = values[0]+values[5]; 
    values[9] = 
    values[5]/10; 
    --values[2]; 

    for (index = 0; index < 10; index++) 
     printf ("values[%i] = %i\n", index, values[index]); 

    return 0; 
} 

爲什麼我在未分配的元素1,4和6-8中有值?我沒有分配任何值。如何在空時自動分配0?爲什麼我的數組中沒有賦值的值?

+0

要添加到奧利的答案,只*總是*初始化變量。在你的例子中,'index'的聲明也放在'for'語句的第一個表達式中。在極少數情況下,初始化變量可能會降低性能,但通常情況下,這應該不是什麼大問題。 –

回答

6

你沒有分配它們,所以你只要得到那些垃圾已經在這些位置的記憶。

要零初始化,你可以這樣做:

int values[10] = {0}; 

或者,使用memset

+0

非常感謝。這個小小的補充幫助。 – Martin

4

在C中,自動變量不會歸零。你想要的是memset()你的陣列到0,以避免這種情況。

+0

我在哪裏添加此行? – Martin

+0

聲明數組後,但我建議你看看@OliCharlesworth的答案,這很容易;) – fge

3

從C99還可以初始化只有你所需要的子對象,其餘的將被初始化爲具有靜態存儲持續時間數據(0int):

int values[10] = 
{ 
    [0] = 197, 
    [2] = -100, 
    [5] = 350, 
    [3] = values[0] + values[5], 
    [9] = values[5]/10 
}; 

更復雜的初始化是不可能的/不清楚這樣做辦法。事情是這樣:

--values[2]; 

不能在初始化完成,因爲如果有對同一元素的更多初始化,只有最後將被使用,並且第一批甚至不能進行評估,對未初始化值造成的減量。從C11標準:

在初始化列表順序應發生的初始化,設置用於 特定子對象重寫爲同一子對象任何前面列出的初始化每個初始化; 151)

151)不限初始化爲其無效,所以不用於初始化子對象可能不是在所有被評估的子對象。

(我認爲它值得有一英尺音符更多...)

不過,我認爲這只是一個例子,因爲沒有一點的話,你可以在這個初始化爲350 - 1案件。

+1

我知道這是合法的,我不知道是從哪種版本的C語言? C99或更早版本? – fge

+0

讓我檢查,我會將它添加到答案 – effeffe

+0

@fge自C99以來。 –

3

雖然奧利查爾斯沃斯的文章顯示的解決方案,讓我多介紹一點「爲什麼」。

雖然操作系統在將程序加載到其中之前往往將內存歸零,但main()並不是C程序實際啓動的地方。實際的起始位置被埋在一些實現依賴的地方,使得main()只是程序啓動期間調用的一系列函數中的最後一個。所有這些早些時候的內部通話都在堆棧中亂寫,留下了他們的混亂。由於每個新的調用都繼承了之前的任何內容,因此您可以看到這一點。如果堆棧增長得足夠大,最終將在未使用的內存中找到操作系統的零,這可能有助於在較大的程序中進行調試,但代碼不能依賴於這樣的零。

相關問題