2014-01-17 230 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我

它永遠不會因爲你是不是新聲明的變量或調用函數來填充堆棧填充堆棧。所以它只是一個無限循環