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









































































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