2014-03-24 50 views
0

我正在閱讀由Kochan編程的C編程,第3版。在c數組中編程

在介紹陣列(程序7.1),他舉了一個例子:

#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; 
} 

應該給輸出

values[0] = 197 
values[1] = 0 
values[2] = -101 
values[3] = 547 
values[4] = 0 
values[5] = 350 
values[6] = 0 
values[7] = 0 
values[8] = 0 
values[9] = 35 

而且我quadriple檢查,我使用完全相同的代碼它只能工作一半,給我一些奇怪的額外數字a [1],[4]

values[0] = 197 
values[1] =052 
values[2] = -101 
values[3] = 547 
values[4] = 17704192 
values[5] = 350 
values[6] = 0 
values[7] = 0 
values[8] = 0 
values[9] = 35 

我是usin g cl arrays.c -o arrays進行編譯。

+2

如果這是書中的確切代碼,我會建議找一本不同的書。 – crashmstr

+0

我試圖找到一個答案,發現[鏈接]後發現相關主題的迴應(https://stackoverflow.com/questions/17709392/odd-output-by-an-array?rq=1)我會嘗試閱讀更多內容,如果有人得到答案,它會非常有幫助。 – user3101661

+0

我有一種感覺,值[10]是本書中的一個全局變量。如果不是,我同意黑客和crashmstr。 – user3386109

回答

5

局部變量是不是初始化。這意味着數組中沒有顯式初始化的條目將包含不確定的值(將被視爲隨機的值)。

實際上,使用未初始化的變量(或未初始化的數組項)是未定義的行爲

+0

這解釋了一點,我在程序中早先編譯了數組[5],這就是爲什麼[0] - [5]是有問題的和上面的「作品」。非常感謝人! – user3101661

2

他們沒有初始化,所以你在consolle輸出看到什麼就是什麼了。在相同的內存位置

你可能想知道爲什麼第一個例子中給出了每個未初始化值「0」和「奇怪的數字」在您的實現....也許第一個例子被分配到存儲區域之前從未使用過,或者一些編譯器決定設置爲0x0000000每個內存寄存器簡稱但尚未初始化

1

如果你看一下在提供的鱈魚它永遠不會設置數組條目1或4的值。因此它們是未定義的,可以是任何值。一些編譯器可能會繼續並將它們初始化爲零,但這不是C規範的一部分,也不應該依賴它。

0

我讀的書中,明確指出,解釋這種程序文本(第100號):

因爲你永遠不分配值的數組元素的元素1中5個,4 ,6到8--顯示的值是沒有意義的。即使程序的 輸出將這些值顯示爲零,但未定義任何未初始化的變量或數組元素 的值。出於這個原因,不應該假定未初始化的變量或數組元素的值。

這就是標準說未初始化的自動局部變量調用未定義的行爲。