6 回答

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超5個贊
你在這里做的只是讀取和寫入曾經(jīng)是地址的內(nèi)存a
。既然你在外面foo
,它只是指向一些隨機(jī)存儲區(qū)的指針。事實(shí)上,在您的示例中,該內(nèi)存區(qū)域確實(shí)存在,此刻沒有其他任何內(nèi)容正在使用它。你不會因?yàn)槔^續(xù)使用它而破壞任何東西,而其他任何東西都沒有覆蓋它。因此,5
仍然存在。在一個真實(shí)的程序中,該內(nèi)存幾乎可以立即重用,你可以通過這樣做來破壞某些東西(盡管這些癥狀可能要到很晚才出現(xiàn)!)
當(dāng)您返回時foo
,您告訴操作系統(tǒng)您不再使用該內(nèi)存,并且可以將其重新分配給其他內(nèi)容。如果你很幸運(yùn),它永遠(yuǎn)不會被重新分配,并且操作系統(tǒng)不會讓你再次使用它,那么你就可以逃脫謊言。盡管如此,你最終還是會寫完最后的那個地址。
現(xiàn)在,如果你想知道編譯器為什么不抱怨,那可能是因?yàn)?code>foo優(yōu)化消除了。它通常會警告你這類事情。C假設(shè)你知道你正在做什么,從技術(shù)上來說你沒有違反范圍(除了a
它之外沒有引用foo
),只有內(nèi)存訪問規(guī)則,它只觸發(fā)警告而不是錯誤。
簡而言之:這通常不會起作用,但有時會偶然發(fā)生。

TA貢獻(xiàn)1789條經(jīng)驗(yàn) 獲得超10個贊
所有答案的一點(diǎn)點(diǎn)補(bǔ)充:
如果你做那樣的事情:
#include<stdio.h>#include <stdlib.h>int * foo(){ int a = 5; return &a;}void boo(){ int a = 7;}int main(){ int * p = foo(); boo(); printf("%d\n",*p);}
輸出可能是:7
這是因?yàn)閺膄oo()返回后,堆棧被釋放,然后由boo()重用。如果您拆卸可執(zhí)行文件,您將清楚地看到它。
- 6 回答
- 0 關(guān)注
- 778 瀏覽
添加回答
舉報(bào)