我正坐在课堂上,经验丰富的老师告诉我,当STACK memory
被程序完全填满时,以下代码将终止。现在我无法理解为什么?以下是源代码: -
#include<stdio.h>
int main()
{
char i;
for (i = 120; i < 130; i++)
printf("\n%d", i);
return 0;
}
现在,我觉得这个循环不会终止的原因是因为一旦程序运行,变量就会在一个内存位置声明,直到程序的生命周期才会改变,我们只是改变已经存在的值声明变量。所以,我想问一下这个问题的答案。另外,如果您认为老师是对的,请解释一下:)
另外,我尝试了很长一段时间运行程序,但内存消耗没有增加甚至一点:|
答案 0 :(得分:10)
该计划的行动取决于您的实施如何定义char
:it 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
答案 3 :(得分:0)
char是1byte long -2 ^ 8到2 ^ 8-1(-128到127)如果你尝试添加1到127,它将是-128发生溢出。 打印变量你会看到相同的。
更改声明 char i to int i
它永远不会填充堆栈,因为您没有声明新变量或调用函数来填充堆栈。所以它只是一个无限循环