[英]Why is there an infinite loop in my program?
int main(void)
{
int i;
int array[5];
for (i = 0; i <= 20; i++)
array[i] = 0;
return 0;
}
為什么上面的代碼陷入無限循環?
您聲明一個包含5個元素的數組,但是要向其中寫入21個元素。 寫入數組的末尾會導致未定義的行為。 在你的情況下,你正在寫入循環計數器i
,將其重置為0,可能是在分配array[5]
。
如果要修復程序,請更改循環以寫入正確數量的元素
int num_elems = sizeof(array) / sizeof(array[0]);
for (i = 0; i < num_elems ; i++)
您通過覆蓋超出允許的內存來調用未定義的行為。 所以一切都會發生。
最有可能的是,它覆蓋了循環計數器。
這是給定代碼中發生的事情。
#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
的實例值寫為0,因為你已經提到過array[i] = 0
,這相當於i=0
所以條件i<=20
總是成功。
現在大問題為什么以這種方式分配內存。
它是在運行時和內核資源的可用性決定的。
這就是為什么我們必須在陣列的極限中居住。
問題是當你嘗試訪問數組邊界之外的元素時,這個元素只有5個大 - 但是在一個21大的循環中。
int main(void)
{
int i;
int array[5];
for (i = 0; i < 5; i++)
array[i] = 0;
return 0;
}
我沒有看到任何無限循環條件,但你在一個帶有5個“槽”的陣列上設置了20個值?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.