簡體   English   中英

為什么我的程序中存在無限循環?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM