int main(void)
{
int i;
int array[5];
for (i = 0; i <= 20; i++)
array[i] = 0;
return 0;
}
爲什麼是停留在一個無限循環上面的代碼?爲什麼我的程序中存在無限循環?
int main(void)
{
int i;
int array[5];
for (i = 0; i <= 20; i++)
array[i] = 0;
return 0;
}
爲什麼是停留在一個無限循環上面的代碼?爲什麼我的程序中存在無限循環?
下面是在給定的代碼中發生的事情。
#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個元素的數組,但是向它寫入21個元素。寫入數組的末尾會導致未定義的行爲。在你的情況下,你正在寫入循環計數器i
,將其重置爲0,可能當您分配array[5]
。
如果你想修改你的程序,改變循環寫入正確的數字元素
int num_elems = sizeof(array)/sizeof(array[0]);
for (i = 0; i < num_elems ; i++)
你被覆蓋超過所允許的內存調用未定義行爲。所以什麼都可能發生。
最有可能的是,它覆蓋了循環計數器。
問題是,當你嘗試的陣列,這是隻有5個大的範圍之外訪問一個元素 - 但在一個循環,是21大。
int main(void)
{
int i;
int array[5];
for (i = 0; i < 5; i++)
array[i] = 0;
return 0;
}
C,而不是C# - 沒有錯誤。 –
我沒有看到任何無限循環條件,但是您在具有5個「槽」的數組上設置了20個值?
在回答之前運行代碼。 –
堆疊塗鴉......但恭喜!你寫了一個5行的程序,它什麼都不做,而且很長一段時間! –
Downvoters - 當問題寫得不好或不遵守網站的規則時,使用反對票,而不是微不足道的問題! –
可能的這個問題的重複.. http://stackoverflow.com/questions/13010004/whats-happening-here-in-this-for-loop – Omkant