这个循环会无限运行吗?

时间:2014-01-17 09:55:28

标签: c

我正坐在课堂上,经验丰富的老师告诉我,当STACK memory被程序完全填满时,以下代码将终止。现在我无法理解为什么?以下是源代码: -

#include<stdio.h>

int main()
{
char i;
for (i = 120; i < 130; i++)
    printf("\n%d", i);

return 0;
}

现在,我觉得这个循环不会终止的原因是因为一旦程序运行,变量就会在一个内存位置声明,直到程序的生命周期才会改变,我们只是改变已经存在的值声明变量。所以,我想问一下这个问题的答案。另外,如果您认为老师是对的,请解释一下:)

另外,我尝试了很长一段时间运行程序,但内存消耗没有增加甚至一点:|

4 个答案:

答案 0 :(得分:10)

该计划的行动取决于您的实施如何定义charit may be a signed or an unsigned type

如果是无符号,则输出10个数字并终止。

如果它已签名,则在大多数实现中,它将在127处换行,下一个值为-128。但根据标准,它是未定义的行为。

我不明白为什么它应该占用完整的堆栈 - 没有递归和没有额外的内存分配,所以

  

由一位非常有经验的老师告诉我,当STACK memory被程序完全填满时,以下代码将终止

表示“从不” - 因为它只是没有填满堆栈。它不可能是一位经验丰富的程序员/老师 - 或者OP不是一位经验丰富的听众,并且误解了老师告诉他的事情。

答案 1 :(得分:3)

原因很简单也很棘手:)

i不是 int ,而是 char 。 这意味着它的范围从-128到+127。

当循环递增索引时,它将在+128处溢出,因此内存中的值将再次为-127。这意味着i再次小于130!循环继续......

现在继续作弊:P

答案 2 :(得分:0)

是的,它会导致无限循环,因为i已被声明为char,范围从 -128到+127 所以它永远不会达到130

时间i达到 127 它回到 -128 ,永远不会达到 130

http://ideone.com/iVLoHe

答案 3 :(得分:0)

char是1byte long -2 ^ 8到2 ^ 8-1(-128到127)如果你尝试添加1到127,它将是-128发生溢出。 打印变量你会看到相同的。

更改声明          char i to int i

它永远不会填充堆栈,因为您没有声明新变量或调用函数来填充堆栈。所以它只是一个无限循环