2014-01-17 108 views
13

我正坐在一堂课上,一位非常有经验的老师告诉我,当STACK memory被程序完全填满时,下列代码将终止。现在我无法理解为什么?下面是源代码: -这个循环会无限运行吗?

#include<stdio.h> 

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

return 0; 
} 

现在,我觉得这个循环将不会终止是因为一旦程序运行时,该变量是在一个存储单元中声明的原因,这是不会改变,直到的生活程序,我们只是改变已经声明的变量的值。所以,我想问这个问题的答案。此外,如果你认为老师是对的,请解释一下:)

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

+6

你现在在欺骗你的老师:) – haccks

+0

是的,因为你使用的是'char',当'i'达到127时,下一个循环中'i ++'的结果将是-128,等等,所以循环将永远。 – Algo

+0

@haccks - 我不认为作弊,但与我的问题是,我通常不相信老师,除非我看到代码在我眼前工作。 :| (在不可数的情况下证明是有益的:P) –

回答

10

程序的动作取决于您的实现如何定义charit may be a signed or an unsigned type

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

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

我不明白为什么要吃掉整个堆栈 - 没有递归并没有额外的内存分配,让

告诉一个非常有经验的老师,下面的代码将终止时STACK memory得到完全由程序填充

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

+3

10个数字? 'i'已被声明为'char'将不会改变事实 – exexzian

+0

考虑如果char是8位有符号类型会发生什么情况,情况可能如此 –

+0

这是一个无限循环!我测试过了。 o__O – haccks

0

是的它会导致死循环,因为i已被宣布为char范围-128到+127所以它从来没有达到过130

时间i达到它回来- 128和永远不会达到130

http://ideone.com/iVLoHe

3

原因很简单,以及棘手:)

i不是INT,但焦炭。 这意味着它的范围从-128到+127。

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

现在继续作弊:P

+4

“我不是一个整数,而是一个字符。这意味着它的范围从-128到127.#:不。不能保证'char'是有符号的或者是无符号的,除非指定。请参阅[glglgl的答案](http://stackoverflow.com/a/21182902/2455888)。 – haccks

+0

这是对的,但我没有经常见到该字符默认是无符号的。另外,我想帮助理解,为什么它可能是一个无限循环 – MyPasswordIsLasercats

+1

除了@haccks所说的,注意签名类型的溢出会调用未定义的行为。只有无符号溢出才能保证环绕。虽然这个答案对于大多数实际的实际应用是正确的,但它在技术上很差并且缺乏重要的细节。 –

0

char是1字节长-2^8比2^8-1(-128〜127)如果您尝试加1 127这将是一个-128发生溢出。打印变量,你会看到相同的。

变化从 焦炭的declartion我为int我

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