2010-12-04 56 views
3

我已經聲明瞭長度爲N的數組(假設)。現在,我使用一個循環將一些值賦給這個數組的元素(循環變量用作數組的索引)。該代碼是如下:數組索引循環變量在C中重置爲零,C++

int main() 
{ 
    int arr[4], j; 
    for(j=0; j<10; j++) 
    {  
    printf("%d\n", j); 
    arr[j] = 0; 
    sleep(1); 
    printf("%d\n\n", j); 
    } 
return 0; 
} 

我期望的輸出爲0 1 2。9.但是實際發生的情況是當j得到復位爲0時,分配ARR [N + 2] = 0(ARR [ 6] = 0,在這種情況下)在循環中執行。 這裏發生了什麼?我錯過了什麼嗎?

回答

8

你的數組有4個元素,你的索引超出範圍,所以你只是跺腳在內存。

鑑於此處的代碼,我期望arr[4]可以重置陣列,但由於您提到它的長度爲NN+2是導致它的原因,因此堆棧中可能會有一些填充。在任何情況下,當你聲明數組和j時,它們都放在堆棧上。在你的情況下,j的位置使得當你的索引超出範圍時,你正在訪問j所在的內存。

+0

你在這裏跺腳是什麼意思? – nitzs 2010-12-04 19:51:32

+0

現在明白了。謝謝。 – nitzs 2010-12-04 19:55:04

3

該代碼的行爲未定義,因爲它有一個錯誤。 arr的大小爲4,但是您正在用j編制超過此大小的索引。

2

您的數組溢出。你用4個元素來定義它:

int arr[4] 

但是你試圖分配10個元素。

j顯然位於數組之後,所以當您分配arr[6] = 0時,您正在清除j