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