看板 Programming 關於我們 聯絡資訊
請先看問題程式碼 這是某考題 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
jtmh:所謂區域變數清空是概念上的,程式實際執行時 218.175.149.46 04/20 00:00
jtmh:只是把 stack pointer 改掉而已,所以還是有 218.175.149.46 04/20 00:02
jtmh:可能可以存取到那個值,不過就跟你們老師說的 218.175.149.46 04/20 00:03
jtmh:一樣,那是依各編譯器實作而自訂的,你不能依 218.175.149.46 04/20 00:03
jtmh:賴這種 behavior, 否則程式何時要爆掉都不知 218.175.149.46 04/20 00:04
jtmh:道,像我加上最佳化之後,印出來的值就變成: 218.175.149.46 04/20 00:05
jtmh:134518108 134518098 (gcc v4.2.3) 218.175.149.46 04/20 00:06
jtmh:另外建議參考 C_and_CPP 版置底文 "C 語言新 218.175.149.46 04/20 00:10
jtmh:言新手十誡(增修一版)" 中的第六誡。 218.175.149.46 04/20 00:11
tenfaces:非常感謝你 好棒的觀念 完全懂了 謝謝 114.42.28.78 04/20 00:23
tenfaces:另外我會注意看置底文的的 謝謝你 114.42.28.78 04/20 00:24