C 这个循环会无限运行吗?

C 这个循环会无限运行吗?,c,C,我正在上课,一位经验丰富的老师告诉我,当堆栈内存被程序完全填满时,以下代码将终止。现在我不明白为什么?以下是源代码:- #include<stdio.h> int main() { char i; for (i = 120; i < 130; i++) printf("\n%d", i); return 0; } #包括 int main() { char i; 对于(i=120;i

我正在上课,一位经验丰富的老师告诉我,当
堆栈内存被程序完全填满时,以下代码将终止。现在我不明白为什么?以下是源代码:-

#include<stdio.h>

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

return 0;
}
#包括
int main()
{
char i;
对于(i=120;i<130;i++)
printf(“\n%d”,i);
返回0;
}
现在,我觉得这个循环不会终止的原因是,一旦程序运行,变量被声明在一个内存位置,直到程序的生命周期才改变,我们只是改变已经声明的变量的值。所以,我想问这个问题的答案。另外,如果你认为老师是对的,也请解释:)


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

该程序的操作取决于您的实现如何定义
char

如果未签名,则输出10个数字并终止

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

我不明白为什么它会吃掉整个堆栈-没有递归,也没有额外的内存分配,所以

一位经验丰富的老师告诉我们,当
堆栈内存被程序完全填满时,以下代码将终止


意思是“永不”——因为它不会填满堆栈。它不可能是这样一个有经验的程序员/老师——或者OP不是一个有经验的听众,并且误解了老师告诉他的一些事情。

是的,这将导致无限循环,因为
i
被声明为
char
,范围从-128到+127,所以它从未达到130

i
达到127的时间返回到-128,但从未达到130


原因既简单又棘手:)

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

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


现在继续作弊:p

字符长度为1字节-2^8到2^8-1(-128到127)如果尝试将1添加到127,则会出现溢出。 打印变量时,您将看到相同的结果

将申报从 字符i到整数i


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

你现在在欺骗你的老师:)是的,因为你使用的是
char
,当
i
达到127时,下一个循环中
i++
的结果将是-128,依此类推,所以循环永远都会发生。@haccks-我不认为作弊,但我的问题是,我通常不相信老师,除非我看到代码在我眼前起作用(这在不可数的情况下被证明是有益的:P)使用该程序填充堆栈的唯一方法是,如果堆栈位于运行代码的终端仿真程序中。(或者如果程序本身的堆栈远远小于任何实际程序所使用的堆栈,即使是在20年或30年前)10个数字
i
已声明为
char
不会改变事实考虑如果char是8位有符号类型会发生什么情况,也可能是这种情况这是一个无限循环!我做了测试。o__O@haccks取决于实现如何定义
char
。签名或不签名都是自由的。@glglglgl,我不会对老师下结论,也许OP不是一个“有经验的听众”。
我不是int,而是char。这意味着其范围从-128到+127。
:否。除非另有规定,否则不保证
char
是有符号的或
无符号的。这是对的,但是我很少看到char在默认情况下是无符号的。此外,我想帮助理解,为什么它可能是一个无限循环除了@haccks所说的,注意签名类型上的溢出调用未定义的行为。只有未签名的溢出才能保证环绕。虽然这个答案在大多数实际应用中都是正确的,但它在技术上很差,并且缺乏重要的细节。我不打算添加这些细节,因为她/他的老师的意图是提高对溢出的认识。@MyPasswordIsLasercats-不是作弊,老师问了一个问题,给出了程序的输出,我说了无限循环,然后他告诉了我上面所说的。但是yea+1表示他的意图是提高对溢流的认识^_^