There should be one-- and preferably only one --obvious way to do it.
posted on 2008-04-18 20:32 猶志 閱讀(1728) 評論(5) 編輯 收藏 引用
昏。在棧上的數據嘛,肯定沒有問題了。 回復 更多評論
你到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個字符。所以,... 回復 更多評論