2015-09-06 67 views
0

我正在通過K & R練習1-13工作,並且我忘記將數組中的元素設置爲0.令我驚訝的是,打印數組是32767;隨後的測試對陣列有不同的元素值,有些不同,有些則不是。在C中初始化int數組而不指定值

我想知道爲什麼會發生這種情況。如果它非常複雜,那麼簡單來說會發生什麼?

#include <stdio.h> 

#define IN 1 /* inside a word */ 
#define OUT 0 /* outside a word */ 

/* print the length of words as input to a histogram with horizontal bars */ 
int main() { 
    int c, i; 
    int state = OUT; 
    int accum = 0; 
    int nchar[10]; 

    while ((c = getchar()) != EOF) { 
    if (c != ' ' && c != '\n' && c != '\t') { 
     state = IN; 
     ++accum; 
    } 
    else { 
     state = OUT; 
     ++nchar[accum]; 
     accum = 0; 
    } 
    } 
    for (i = 0; i < 10; ++i) 
    printf("%d\n", nchar[i]); 
    return 0; 
} 

輸入&相應的輸出:

hello codes 

4195584 
0 
0 
0 
4196032 
2 
4195584 
0 
-1608045280 
32767 
+3

它被稱爲「未定義的行爲」。沒有人設置任何數組值,所以你永遠不能說將會發生什麼,雖然有時候它可能是可預測的。 –

+1

我更擔心你使用'accum'。你從不檢查它何時達到數組限制。值'0'..'9'確定,然後在極端情況下,您可能需要取消計算機,因爲將'nchar'索引10非常糟糕。 while((c = getchar())!= EOF && accum <10){' –

回答

1

創建數組時,編譯器會聲明堆棧上的內存。如果您正在初始化數組或(通常)爲其分配值,則數據將寫入該內存位置。

如果您沒有初始化任何內容,只聲稱內存,這是之前已經使用過的其他內容。在數據被移除後,堆棧不會清零,因爲它會浪費太多的處理器時間,並且無論如何RAM都會被重新填充。

1

這只是當你不初始化內存會發生什麼。你得到什麼之前你的程序聲稱它...

+0

如何確定將使用哪個內存? –

+2

這主要取決於操作系統,但通常情況下,你不能假設你將得到什麼。 – Amit

+2

由於堆棧的工作方式,您通常會因爲已超出作用域而不再存在的變量(如完成的函數調用的局部變量)而以舊值結束。如果你不走運,你可能會「幸運」並「繼承」一個適合你的初始值 - 直到代碼中其他不相關部分的改變破壞了所有內容。像這樣的錯誤可能很難找到(但'valgrind'工具可以幫助你很多)。 –

1

無論以前在你的地址空間中運行的程序放在那裏。所以,如果一個程序把,比如說,77,地址0xabcd5657,然後你看的地址,你會得到77.這是因爲C爲你所做不是零初始化的內存,但你可以自己用memset

memset(nchar, 0, 10);