Почему в моей программе есть бесконечный цикл?

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

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

    return 0;
}

Почему приведенный выше код застревает в бесконечном цикле?

Ответ 1

Вот что происходит в данном коде.

#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 всегда успешно.

Теперь БОЛЬШОЙ вопрос, почему память выделяется таким образом.

Решено во время выполнения и доступности ресурсов для ядра.

Итак, почему мы должны остановиться в пределах массива.

Ответ 2

Вы объявляете массив с 5 элементами, но пишете ему 21 элемент. Запись в конце массива приводит к поведению undefined. В этом случае вы пишете счетчик циклов i, сбросив его на 0, возможно, когда вы назначаете array[5].

Если вы хотите исправить свою программу, измените цикл, чтобы записать правильное количество элементов

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

Ответ 3

Вы вызываете поведение undefined, перезаписывая за пределами памяти, которую вы разрешаете. Так что все может случиться.

Скорее всего, он перезаписывает счетчик циклов.

Ответ 4

Проблема заключается в том, что вы пытаетесь получить доступ к элементу вне границ массива, который имеет только 5 больших значений, но в цикле, который является 21 большим.

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

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

    return 0;
}

Ответ 5

Я не вижу никакого бесконечного условия цикла, но вы задаете до 20 значений в массиве с 5 "слотами"???