Ответ 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
всегда успешно.
Теперь БОЛЬШОЙ вопрос, почему память выделяется таким образом.
Решено во время выполнения и доступности ресурсов для ядра.
Итак, почему мы должны остановиться в пределах массива.