2012-12-24 74 views
10
int main(void) 
{ 
    int i; 
    int array[5]; 

    for (i = 0; i <= 20; i++) 
    array[i] = 0; 

    return 0; 
} 

爲什麼是停留在一個無限循環上面的代碼?爲什麼我的程序中存在無限循環?

+6

堆疊塗鴉......但恭喜!你寫了一個5行的程序,它什麼都不做,而且很長一段時間! –

+7

Downvoters - 當問題寫得不好或不遵守網站的規則時,使用反對票,而不是微不足道的問題! –

+2

可能的這個問題的重複.. http://stackoverflow.com/questions/13010004/whats-happening-here-in-this-for-loop – Omkant

回答

8

下面是在給定的代碼中發生的事情。

#include<stdio.h> 
#include<string.h> 
int main(void) 
{ 
    int i; 
    int array[5]; 

    for (i = 0; i <= 20; i++) 
    { 
     printf("%p %p \n",&i,&array[i]); 
     printf("the value of i is %d \n",i); 
     sleep(1); 
     array[i] = 0; 
     printf("i may be modified here lets see what i is %d \n", i); 
    } 

    return 0; 
} 
在我的堆棧內存

我得到的地址位置作爲

i被存儲在位置0xbfd1048c地址

array被存儲在位置0xbfd10478地址

當你正在遞增i值對於在一個時間點的每個循環,地址array[i]等於地址i(其正好指針解引用)

那麼你存儲在array[i]不過是i的實例地址,以便您在i寫'你剛纔提到array[i] = 0這相當於i=0這樣的條件i<=20總是成功的小號實例值設置爲0。

現在BIG問題爲什麼內存以這種方式分配。

它在運行時和內核可用資源的情況下決定。

所以這就是爲什麼我們必須在陣列的極限範圍內考慮。

+5

示例代碼和地址記錄是一個很好的答案。一個小問題 - 堆棧中項目之間的偏移量是在編譯時決定的,而不是在運行時決定的。 – simonc

+0

堆棧框架的佈局(我和數組都在堆棧上)由編譯器決定 – josefx

21

你聲明一個有5個元素的數組,但是向它寫入21個元素。寫入數組的末尾會導致未定義的行爲。在你的情況下,你正在寫入循環計數器i,將其重置爲0,可能當您分配array[5]

如果你想修改你的程序,改變循環寫入正確的數字元素

int num_elems = sizeof(array)/sizeof(array[0]); 
for (i = 0; i < num_elems ; i++) 
8

你被覆蓋超過所允許的內存調用未定義行爲。所以什麼都可能發生。

最有可能的是,它覆蓋了循環計數器。

2

問題是,當你嘗試的陣列,這是隻有5個大的範圍之外訪問一個元素 - 但在一個循環,是21大。

int main(void) 
{ 
    int i; 
    int array[5]; 

    for (i = 0; i < 5; i++) 
    array[i] = 0; 

    return 0; 
} 
+2

C,而不是C# - 沒有錯誤。 –

1

我沒有看到任何無限循環條件,但是您在具有5個「槽」的數組上設置了20個值?

+1

在回答之前運行代碼。 –

相關問題