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
в 0, как вы уже упоминали array[i] = 0
, что эквивалентно i=0
, поэтому условие i<=20
всегда успешно.
Теперь БОЛЬШОЙ вопрос, почему память выделяется таким образом.
Решено во время выполнения и доступности ресурсов для ядра.
Итак, почему мы должны остановиться в пределах массива.
Вы объявляете массив с 5 элементами, но пишете ему 21 элемент. Запись в конце массива приводит к поведению undefined. В этом случае вы пишете счетчик циклов i
, сбросив его на 0, возможно, когда вы назначаете array[5]
.
Если вы хотите исправить свою программу, измените цикл, чтобы записать правильное количество элементов
int num_elems = sizeof(array) / sizeof(array[0]);
for (i = 0; i < num_elems ; i++)
Вы вызываете поведение undefined, перезаписывая за пределами памяти, которую вы разрешаете. Так что все может случиться.
Скорее всего, он перезаписывает счетчик циклов.
Проблема заключается в том, что вы пытаетесь получить доступ к элементу вне границ массива, который имеет только 5 больших значений, но в цикле, который является 21 большим.
int main(void)
{
int i;
int array[5];
for (i = 0; i < 5; i++)
array[i] = 0;
return 0;
}
Я не вижу никакого бесконечного условия цикла, но вы задаете до 20 значений в массиве с 5 "слотами"???