There should be one-- and preferably only one --obvious way to do it.
posted on 2008-04-18 20:32 猶志 閱讀(1728) 評(píng)論(5) 編輯 收藏 引用
昏。在棧上的數(shù)據(jù)嘛,肯定沒(méi)有問(wèn)題了。 回復(fù) 更多評(píng)論
你到Release下看看.再用GCC編譯一下試試.我試了這幾種情況運(yùn)行結(jié)果都不一樣.說(shuō)明這種用法存在問(wèn)題,與printf無(wú)關(guān).應(yīng)該heap或在調(diào)用函數(shù)里把空間分配好,傳給子函數(shù)賦值. 回復(fù) 更多評(píng)論
所謂stack自動(dòng)清理的意思是:函數(shù)調(diào)用前后調(diào)整棧指針(SP)的任務(wù)編譯器會(huì)自動(dòng)幫你完成 至于指向棧中位置的指針,當(dāng)然可以隨便用,不過(guò)這和把指針指向內(nèi)存位置0一樣,后果自負(fù) 程序的運(yùn)行結(jié)果無(wú)法證明程序的正確性 回復(fù) 更多評(píng)論
這是初學(xué)者很容易犯錯(cuò)誤,想當(dāng)年我初學(xué)C++時(shí)也是對(duì)這個(gè)問(wèn)題覺(jué)得很奇怪。首先,把棧指針傳遞出來(lái)是原則性錯(cuò)誤,在C++裡是不允許的,而在函數(shù)結(jié)束後讀取該指針指向的內(nèi)容的行為是未知的。其次,棧內(nèi)存是在函數(shù)開(kāi)始執(zhí)行時(shí)進(jìn)行分配,在函數(shù)結(jié)束進(jìn)行釋放的。再次,棧內(nèi)容在函數(shù)結(jié)束是不會(huì)被清理的,因?yàn)獒尫帕说膬?nèi)存不需要再去清理。但正因?yàn)闆](méi)有進(jìn)行清理,在調(diào)用此函數(shù)後,你馬上讀取該內(nèi)存,在大部分情況下是可以讀取到原來(lái)的內(nèi)容的,只要沒(méi)有其它的程序使用到該塊內(nèi)存,那些內(nèi)容是不會(huì)改變的,但這種操作是錯(cuò)誤的,因?yàn)樵搲K內(nèi)存已經(jīng)被釋放了,你所讀取的是已經(jīng)被釋放了的內(nèi)存的內(nèi)容。根據(jù)各種編譯器的編譯結(jié)果不同,根據(jù)系統(tǒng)需要不同,根據(jù)你程序編寫(xiě)的不同,你這個(gè)函數(shù)所產(chǎn)生的結(jié)果是不可預(yù)料的,如上,後果自負(fù)。 回復(fù) 更多評(píng)論
starofrainnight說(shuō)的很對(duì);正如樓主所述,stack使用是由高向低進(jìn)行的。而您代碼中描述的: char szMessage[100]; strcpy(szMessage, "this is just a test!\n"); 數(shù)組Message是如此之大,而使用卻如此之小,僅"this is just a test!\n"幾個(gè)字符。這樣,存儲(chǔ)szMessage時(shí)從低址向高址進(jìn)行,100-22=78個(gè)字節(jié)尚未使用,退出GetString函數(shù)之后。sp指針復(fù)原至調(diào)用GetString之前的位置。而調(diào)用GetPerson的活動(dòng)記錄太小,以至于沒(méi)有破壞szMessage中存儲(chǔ)的22個(gè)字符。所以,... 回復(fù) 更多評(píng)論