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
写'你刚才提到array[i] = 0
这相当于i=0
这样的条件i<=20
总是成功的小号实例值设置为0。
现在BIG问题为什么内存以这种方式分配。
它在运行时和内核可用资源的情况下决定。
所以这就是为什么我们必须在阵列的极限范围内考虑。
你声明一个有5个元素的数组,但是向它写入21个元素。写入数组的末尾会导致未定义的行为。在你的情况下,你正在写入循环计数器i
,将其重置为0,可能当您分配array[5]
。
如果你想修改你的程序,改变循环写入正确的数字元素
int num_elems = sizeof(array)/sizeof(array[0]);
for (i = 0; i < num_elems ; i++)
你被覆盖超过所允许的内存调用未定义行为。所以什么都可能发生。
最有可能的是,它覆盖了循环计数器。
问题是,当你尝试的阵列,这是只有5个大的范围之外访问一个元素 - 但在一个循环,是21大。
int main(void)
{
int i;
int array[5];
for (i = 0; i < 5; i++)
array[i] = 0;
return 0;
}
C,而不是C# - 没有错误。 –
我没有看到任何无限循环条件,但是您在具有5个“槽”的数组上设置了20个值?
在回答之前运行代码。 –
堆叠涂鸦......但恭喜!你写了一个5行的程序,它什么都不做,而且很长一段时间! –
Downvoters - 当问题写得不好或不遵守网站的规则时,使用反对票,而不是微不足道的问题! –
可能的这个问题的重复.. http://stackoverflow.com/questions/13010004/whats-happening-here-in-this-for-loop – Omkant