2014-11-06 107 views
0

我開始學習C++中的數組,並且我似乎無法理解數組在循環超出後繼續以及它們返回的值的原因。Array For Loop - Exceeded Value

int array[5] = {0, 1, 2, 3, 4} 
int i; 
i=0; 
for (i=0, i < 9, i+=2) 
{ 
    printf("%d ", array [i]); 
} 

爲什麼數組在4之後打印出0或隨機數的值?

*我明白我在打印出的第1,第3,第5,第7和第9號

+0

失蹤環在體內你的問題。 – Barry 2014-11-06 22:34:41

+2

您正在進入未定義的行爲領域。任何事情都沒有了,也沒有什麼可以承諾它可能工作,它可能會崩潰和燃燒。 http://stackoverflow.com/q/367633/477563 – 2014-11-06 22:35:38

+0

好的,我會問你 - 當你犯這個錯誤時程序應該做什麼? – PaulMcKenzie 2014-11-06 22:42:06

回答

-1

我是C#開發人員,但在我看來,你有一個數組具有5個元素,且您嘗試打印不存在的元素。 嘗試更改您的初始語句爲: int array [9] = {0,1,2,3,4,5,6,7,8,9} 並查看是否有效。

+0

這個答案有什麼不對的地方,我得到了dinged?有人已經提到該行爲未定義(正確)。所以,我只是說如何做才能解決這個問題(而不是複製該回復。)也許我應該停止幫助.... – JustMeToo 2014-11-13 19:13:31

0

因爲數組索引語法只是爲pointer數學的捷徑:

array[i] 

是一樣的:

*(array + i) 

在你的情況是數學恰好制定出內存中的地址存在的,可由您的程序尋址,幷包含一些隨機數據。

訪問這些數據被稱爲buffer overflow錯誤。

1

您正在打印只有5個數字的數組的第1,3,5,7和9個數字。

在超出第5個數字後,您將打印不屬於數組的內存中的未定義值。

爲什麼循環會繼續超出數組的實際長度?因爲你告訴它,而C++將允許這樣做。

+0

他可以從一個平行宇宙正在打印定義良好的價值觀,你都知道。 – 2014-11-06 22:45:19

0

C++中的數組基本上是一個指針和偏移量的句法包裝。一個數組變量可以傳遞給一個相同類型的指針參數。

array[i] 

相同

*(array + i) 

C++不做界對你的陣列檢查Java或C#的方式做。原則是C++是語言不會做你沒有要求的任何事情。檢查您是否正在訪問數組越界並拋出異常會增加開銷,如果您知道您將訪問邊界,則這是不必要的。

當你訪問應用程序仍然可以訪問的內存時,你最終得到的是未初始化的內存。

你可以通過程序得到正確的元素數量的數組中,或相同的代碼,你可以使用一個std ::向量和檢查大小():

#include <vector> 

std::vector<int> vals = {0, 1, 2, 3, 4}; 
for (int i=0, i < vals.size(), i+=2) 
{ 
    printf("%d ", array [i]); 
}