printf都做了什么??
為測試stack指針是否由系統(tǒng)管理,從函數(shù)中返回后是否繼續(xù)可用,寫了一些代碼:









































































There should be one-- and preferably only one --obvious way to do it.
昏。在棧上的數(shù)據(jù)嘛,肯定沒有問題了。 回復 更多評論
你到Release下看看.再用GCC編譯一下試試.
我試了這幾種情況運行結果都不一樣.
說明這種用法存在問題,與printf無關.
應該heap或在調用函數(shù)里把空間分配好,傳給子函數(shù)賦值. 回復 更多評論
所謂stack自動清理的意思是:函數(shù)調用前后調整棧指針(SP)的任務編譯器會自動幫你完成
至于指向棧中位置的指針,當然可以隨便用,不過這和把指針指向內(nèi)存位置0一樣,后果自負
程序的運行結果無法證明程序的正確性 回復 更多評論
這是初學者很容易犯錯誤,想當年我初學C++時也是對這個問題覺得很奇怪。
首先,把棧指針傳遞出來是原則性錯誤,在C++裡是不允許的,而在函數(shù)結束後讀取該指針指向的內(nèi)容的行為是未知的。
其次,棧內(nèi)存是在函數(shù)開始執(zhí)行時進行分配,在函數(shù)結束進行釋放的。
再次,棧內(nèi)容在函數(shù)結束是不會被清理的,因為釋放了的內(nèi)存不需要再去清理。
但正因為沒有進行清理,在調用此函數(shù)後,你馬上讀取該內(nèi)存,在大部分情況下是可以讀取到原來的內(nèi)容的,只要沒有其它的程序使用到該塊內(nèi)存,那些內(nèi)容是不會改變的,但這種操作是錯誤的,因為該塊內(nèi)存已經(jīng)被釋放了,你所讀取的是已經(jīng)被釋放了的內(nèi)存的內(nèi)容。
根據(jù)各種編譯器的編譯結果不同,根據(jù)系統(tǒng)需要不同,根據(jù)你程序編寫的不同,你這個函數(shù)所產(chǎn)生的結果是不可預料的,如上,後果自負。 回復 更多評論
starofrainnight說的很對;正如樓主所述,stack使用是由高向低進行的。而您代碼中描述的:
char szMessage[100];
strcpy(szMessage, "this is just a test!\n");
數(shù)組Message是如此之大,而使用卻如此之小,僅"this is just a test!\n"幾個字符。這樣,存儲szMessage時從低址向高址進行,100-22=78個字節(jié)尚未使用,退出GetString函數(shù)之后。sp指針復原至調用GetString之前的位置。而調用GetPerson的活動記錄太小,以至于沒有破壞szMessage中存儲的22個字符。所以,...
回復 更多評論
只有注冊用戶登錄后才能發(fā)表評論。 | ||
【推薦】100%開源!大型工業(yè)跨平臺軟件C++源碼提供,建模,組態(tài)!
![]() |
||
網(wǎng)站導航:
博客園
IT新聞
BlogJava
博問
Chat2DB
管理
|
||
|