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

看板C_and_CPP (C/C++)作者 ( )時間12年前 (2014/04/17 12:34), 12年前編輯推噓3(3022)
留言25則, 5人參與, 最新討論串1/2 (看更多)
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........... 請教各位版友對這種題目見解 究竟怎樣才是對的 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.172.99.6 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1397709257.A.43F.html

04/17 12:42, , 1F
10也符合"不確定"的結果啊
04/17 12:42, 1F

04/17 12:43, , 2F
"一般而言"你會拿到10 可是沒有任何保證
04/17 12:43, 2F

04/17 12:44, , 3F
你也可能得到硬碟格式化或宇宙毀滅
04/17 12:44, 3F

04/17 12:45, , 4F
10 10是這樣來的 當f結束後把區域變數y(20)傳回給main中
04/17 12:45, 4F

04/17 12:46, , 5F
x 此時呼叫g,g中的區域變數x會剛好用到main中x所指到的記
04/17 12:46, 5F

04/17 12:47, , 6F
憶體 所以當g執行結束g中的x變成10 同時main中的x也變成
04/17 12:47, 6F

04/17 12:48, , 7F
10 版本一的說法就是兩個函式剛好同樣數量與型態區域
04/17 12:48, 7F

04/17 12:48, , 8F
變數會共用相同記憶體 所以會有10 10結果 版本二則是比較
04/17 12:48, 8F

04/17 12:49, , 9F
合理 偏偏用dev c++去跑就是跑出10 10 所以請教各位該怎
04/17 12:49, 9F

04/17 12:49, , 10F
麼樣解釋比較完善?如同該位老師的說法嗎?
04/17 12:49, 10F

04/17 12:51, , 11F
10 10只是你的complier你的機器實做出來的結果
04/17 12:51, 11F

04/17 12:51, , 12F
"不確定"是說環境換了結果也可能換 語言標準沒做保證
04/17 12:51, 12F

04/17 12:53, , 13F
這叫做結果"用devc++剛好會是10",不叫"一定會是10"
04/17 12:53, 13F

04/17 12:55, , 14F
有些compiler在debug模式下會把超過stack的記憶體抹掉
04/17 12:55, 14F

04/17 12:55, , 15F
用來偵測這種不正確存取,這時結果就會變
04/17 12:55, 15F

04/17 12:56, , 16F
標準並沒有限制不能去更動這些正常碰不到的值
04/17 12:56, 16F

04/17 13:38, , 17F
去編譯器選項, 開個最佳化, 再試試看執行結果吧...
04/17 13:38, 17F

04/17 13:44, , 18F
至少我用 gcc 測試, 最佳化用 -O1 和 -O2, 答案都不是 10 10
04/17 13:44, 18F

04/17 15:33, , 19F
@@ 哪個國考考這種擺明是hack的東西阿...
04/17 15:33, 19F

04/17 16:33, , 20F
實用時寫出這樣f的人會被刮吧
04/17 16:33, 20F

04/17 17:51, , 21F
了解了 感謝各位的解釋 謝謝
04/17 17:51, 21F

04/17 17:56, , 22F
出在96年交通升資的程式語言中 應該如同該補習班金老師說
04/17 17:56, 22F

04/17 17:56, , 23F
的 考懸疑指標的觀念
04/17 17:56, 23F

04/17 17:57, , 24F
結果同個補習班(高點)出的書卻(版本一)....
04/17 17:57, 24F

04/17 17:57, , 25F
再次感謝各位
04/17 17:57, 25F
※ 編輯: Sunofgod (218.164.90.184), 04/17/2014 17:58:28
文章代碼(AID): #1JJrd9G_ (C_and_CPP)
文章代碼(AID): #1JJrd9G_ (C_and_CPP)