2012-12-24 72 views
10
int main(void) 
{ 
    int i; 
    int array[5]; 

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

    return 0; 
} 

为什么是停留在一个无限循环上面的代码?为什么我的程序中存在无限循环?

+6

堆叠涂鸦......但恭喜!你写了一个5行的程序,它什么都不做,而且很长一段时间! –

+7

Downvoters - 当问题写得不好或不遵守网站的规则时,使用反对票,而不是微不足道的问题! –

+2

可能的这个问题的重复.. http://stackoverflow.com/questions/13010004/whats-happening-here-in-this-for-loop – Omkant

回答

8

下面是在给定的代码中发生的事情。

#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

示例代码和地址记录是一个很好的答案。一个小问题 - 堆栈中项目之间的偏移量是在编译时决定的,而不是在运行时决定的。 – simonc

+0

堆栈框架的布局(我和数组都在堆栈上)由编译器决定 – josefx

21

你声明一个有5个元素的数组,但是向它写入21个元素。写入数组的末尾会导致未定义的行为。在你的情况下,你正在写入循环计数器i,将其重置为0,可能当您分配array[5]

如果你想修改你的程序,改变循环写入正确的数字元素

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

你被覆盖超过所允许的内存调用未定义行为。所以什么都可能发生。

最有可能的是,它覆盖了循环计数器。

2

问题是,当你尝试的阵列,这是只有5个大的范围之外访问一个元素 - 但在一个循环,是21大。

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

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

    return 0; 
} 
+2

C,而不是C# - 没有错误。 –

1

我没有看到任何无限循环条件,但是您在具有5个“槽”的数组上设置了20个值?

+1

在回答之前运行代码。 –

相关问题