1、如果函數(shù)的參數(shù)是一個指針,不要用該指針去申請動態(tài)內(nèi)存
上面的代碼在編譯無錯誤的,可是在執(zhí)行時,出現(xiàn)了錯誤。調(diào)試發(fā)現(xiàn),str仍然為NULL。str并沒有指向GetMemory()所申請的內(nèi)存,在函數(shù)被調(diào)用時,編譯器會被調(diào)用函數(shù)的參數(shù)產(chǎn)生一個副本_p,使_p=p,如果函數(shù)體內(nèi)修改_p的內(nèi)容,那么導致參數(shù)p的內(nèi)容作相應的修改,這就是指針可以作為輸出參數(shù)的原因。在本例中,_p重新申請了一塊內(nèi)存,只是把_p所指的內(nèi)存地址改變了,但是p絲毫未變。所以GetMemory并不能返回任何東西。所以str仍然為NULL,導致程序運行錯誤。事實上,每執(zhí)行一次GetMemory(),就會造成內(nèi)存的泄露,因為申請的內(nèi)存并沒有被釋放。 如果要用指針參數(shù)申請內(nèi)存,使用指向指針的指針可以完成此功能:
2、函數(shù)返回值傳遞動態(tài)內(nèi)存
Copyright @ 煙皚 Powered by: .Text and ASP.NET Theme by: .NET Monster