[問題] 中央堆疊記憶體配置與釋放

作者: Sunofgod ( )   2014-04-17 12:34:15
int *f(int x)
{
int y;
y = x + 10;
return &y;
}
int g(int y)
{
int x;
x = y – 10;
return x;
}
void main( )
{
int *x, y;
x = f(10);
y = g(*x);
printf(“%d %d\n”, *x, y);
}
這是一題國考考題
出現兩種版本的答案
版本一:函數所使用的變數型態與數量一樣,記憶體會配置到同樣的位置
所以f跟g的區域變數共用相同記憶體位址 主程式的指標x當f執行結束跟著執行g時
會指到g當中的區域變數x 印出結果10 10
版本二:副程式執行結束後所屬記憶體會被釋放 因此主程式中的x變成懸疑指標
指像什麼東西變成不知道,至於兩個副程式的區域變數共用到相同記憶體只能說有可能
但不是鐵律 印出結果 不確定 不確定(因為x後來指到的是系統記憶體 不確定內容)
http://ppt.cc/940~ 這是某位補習班老師的解答,也就是版本二
至於版本一我是參考一本補習班出的 胡世雄 程式語言得參考書
自己用dev c++跑的確是10 10,兩個副程式的區域變數也的確共用相同記憶體位址
但自己以往所學的確是版本二比較合理
這是國考非選 所以沒有標準答案 也不知道當初怎樣的答案會拿分....
這是我覺得國考很黑箱的一個地方Orz...........
請教各位版友對這種題目見解 究竟怎樣才是對的
謝謝
作者: azureblaze (AzureBlaze)   2014-04-17 12:42:00
10也符合"不確定"的結果啊"一般而言"你會拿到10 可是沒有任何保證你也可能得到硬碟格式化或宇宙毀滅
作者: Sunofgod ( )   2014-04-17 12:45:00
10 10是這樣來的 當f結束後把區域變數y(20)傳回給main中x 此時呼叫g,g中的區域變數x會剛好用到main中x所指到的記憶體 所以當g執行結束g中的x變成10 同時main中的x也變成10 版本一的說法就是兩個函式剛好同樣數量與型態區域變數會共用相同記憶體 所以會有10 10結果 版本二則是比較合理 偏偏用dev c++去跑就是跑出10 10 所以請教各位該怎麼樣解釋比較完善?如同該位老師的說法嗎?
作者: azureblaze (AzureBlaze)   2014-04-17 12:51:00
10 10只是你的complier你的機器實做出來的結果"不確定"是說環境換了結果也可能換 語言標準沒做保證這叫做結果"用devc++剛好會是10",不叫"一定會是10"有些compiler在debug模式下會把超過stack的記憶體抹掉用來偵測這種不正確存取,這時結果就會變標準並沒有限制不能去更動這些正常碰不到的值
作者: yvb   2014-04-17 13:38:00
去編譯器選項, 開個最佳化, 再試試看執行結果吧...至少我用 gcc 測試, 最佳化用 -O1 和 -O2, 答案都不是 10 10
作者: Killercat (殺人貓™)   2014-04-17 15:33:00
@@ 哪個國考考這種擺明是hack的東西阿...
作者: jokester (蠻王科科)   2014-04-17 16:33:00
實用時寫出這樣f的人會被刮吧
作者: Sunofgod ( )   2014-04-17 17:51:00
了解了 感謝各位的解釋 謝謝出在96年交通升資的程式語言中 應該如同該補習班金老師說的 考懸疑指標的觀念結果同個補習班(高點)出的書卻(版本一)....再次感謝各位

Links booklink

Contact Us: admin [ a t ] ucptt.com