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表示他的意图是提高对溢流的认识^_^