[問題] 函數結束時 區域變數會跟著清空嗎?

看板Programming作者 (我愛三筒小叮噹~~)時間16年前 (2009/04/19 23:41), 編輯推噓2(209)
留言11則, 2人參與, 最新討論串1/1
請先看問題程式碼 這是某考題 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); } 印出來的結果 我筆算 和 程式跑出來 都是--> 10,10 但老師在解題是 認為 二者答案都是 不確定 依各編譯器實作而自訂 他的觀念是 function f 和 g 在被呼叫完之後 區域變數就清空 所以當main在運算 *x 還有 y的時候 以無法參考到原有的記憶體位置 聽他的觀念 覺得很合理 但實際上用Visual C++跑 又不是這麼回事 請有經驗的版友 替我解惑 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.42.28.78

04/20 00:00, , 1F
所謂區域變數清空是概念上的,程式實際執行時
04/20 00:00, 1F

04/20 00:02, , 2F
只是把 stack pointer 改掉而已,所以還是有
04/20 00:02, 2F

04/20 00:03, , 3F
可能可以存取到那個值,不過就跟你們老師說的
04/20 00:03, 3F

04/20 00:03, , 4F
一樣,那是依各編譯器實作而自訂的,你不能依
04/20 00:03, 4F

04/20 00:04, , 5F
賴這種 behavior, 否則程式何時要爆掉都不知
04/20 00:04, 5F

04/20 00:05, , 6F
道,像我加上最佳化之後,印出來的值就變成:
04/20 00:05, 6F

04/20 00:06, , 7F
134518108 134518098 (gcc v4.2.3)
04/20 00:06, 7F

04/20 00:10, , 8F
另外建議參考 C_and_CPP 版置底文 "C 語言新
04/20 00:10, 8F

04/20 00:11, , 9F
言新手十誡(增修一版)" 中的第六誡。
04/20 00:11, 9F

04/20 00:23, , 10F
非常感謝你 好棒的觀念 完全懂了 謝謝
04/20 00:23, 10F

04/20 00:24, , 11F
另外我會注意看置底文的的 謝謝你
04/20 00:24, 11F
文章代碼(AID): #19wqOVSx (Programming)