[問題] 請教一個程式問題

看板C_and_CPP作者 (missun)時間16年前 (2009/06/17 13:48), 編輯推噓4(4010)
留言14則, 6人參與, 最新討論串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); } 請問一下為什麼最後的output是10,10 試過在第一個在第一個function中加入printf 以及在main function中的x=f(10);後也加入printf 最後答案都不一樣 也試過在第一個function中y = x + 10;改成y = 3; 答案也莫名其妙 我想這跟function中stack有關吧 只是想不透為什麼最後的output是如此 請高手能替我解答嗎 謝謝囉 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.169.78.226

06/17 21:53, , 1F
f中的y在程式結束後就不見了,也就是那塊記憶可能被拿到別
06/17 21:53, 1F

06/17 21:54, , 2F
的地方使用,所以不要這樣使用。
06/17 21:54, 2F

06/17 21:55, , 3F
上面手誤,是在函數結束後y的記憶體就釋放掉了。
06/17 21:55, 3F

06/17 21:57, , 4F
要這樣做你的y就要用new的 int *y=new int; return y;
06/17 21:57, 4F

06/17 21:57, , 5F
這件事我曉得...只是我很好奇為什麼這樣用答案會是這樣
06/17 21:57, 5F

06/17 21:57, , 6F
但請記得要成對的 delete or 成對的malloc free
06/17 21:57, 6F

06/17 21:58, , 7F
到底stack是怎麼堆的
06/17 21:58, 7F

06/17 22:05, , 8F
錯誤的程式會跑出意外的結果其實也沒有什麼好奇怪的....
06/17 22:05, 8F

06/17 22:06, , 9F
有興趣研究怎樣錯的, 就debug拉asm出來一步一步看吧....
06/17 22:06, 9F

06/17 22:07, , 10F
順便也把register和memory拉出來, 就能看它們的變化....
06/17 22:07, 10F

06/17 22:17, , 11F
f(10)不就是 push 10然後call f然後add ESP,4最後把 eax 的值
06/17 22:17, 11F

06/17 22:17, , 12F
mov 到 x去,至此你的x都還在啊,可惜下一行的g(*x)的第一個
06/17 22:17, 12F

06/17 22:18, , 13F
動作就又是push 20,很快x指的那地方就被蓋掉啦
06/17 22:18, 13F

06/17 23:22, , 14F
十誡之六
06/17 23:22, 14F
文章代碼(AID): #1AEFHARz (C_and_CPP)