傳遞動態記憶體

2021-05-26 20:00:21 字數 1089 閱讀 1253

當你涉及到c/c++的核心程式設計的時候,你會無止境地與記憶體管理打交道。這些往往會使人受盡折磨,所以如果你想深入c/c++程式設計,你必須靜下心來好好苦一番。

現在我們將討論c/c++裡我認為哪一本書都沒有完全說清楚,也是涉及概念細節最多,語言中最難的技術之一的動態記憶體的傳遞。並且在軟體開發中很多專業人員並不能寫出相關的合格的**。

【問題】下面的這個程式測試會有什麼結果

#include void getmemory(char* p,int num)

int main()

【分析問題】

str始終為null,程式編譯可以通過,但是執行會中斷在 strcpy(str, "hello") 這行。

毛病出在函式getmemory中。void  getmemory(char* p, int num)中的p 實際上是主函式中str的乙個副本,編譯器總是要為函式的每個引數製作臨時副本。在本例中,p申請了新的記憶體,只是把p所指的記憶體位址改變了,但是str絲毫未變。因為函式getmemory沒有返回值,因此str並不指向p所申請的那段記憶體。事實上,每執行一次getmemory就會申請一塊記憶體,但申請的記憶體卻不會有效釋放,結果記憶體一直被獨佔,有可能導致記憶體洩露。

【解決問題】

可以選擇兩種解決方法

#include void getmemory(char** p,int num)

int main()

這樣的話,程式就可以執行成功。字串是乙個比較特殊的例子。我們分別列印*str,str,&str可以發現,結果分別是:h,hello,0027fee4(這個不固定),str就是字串的值,*str是字串中某一字元的值,預設的是首字元,所以是h,&str是字串的位址。

2)由於「指向指標的指標」這個概念不容易理解,我們可以用函式返回值來傳遞記憶體。這個方法更加簡單,**如下:

#include char* getmemory(char* p,int num)

int main()

ps: 摘自《程式設計師面試寶典》

傳遞動態記憶體

當你涉及到c c 的核心程式設計的時候,你會無止境地與記憶體管理打交道.這些往往會使人受盡折磨.所以如果你想深入c c 程式設計,你必須靜下心來,好好苦一番.現在我們將討論c c 裡我認為哪一本書都沒有完全說清楚,也是涉及概念細節最多,語言中最難的技術之一的動態記憶體的傳遞.並且在軟體開發中很多專業...

傳遞動態記憶體

當你涉及到c c 的核心程式設計的時候,你會無止境地與記憶體管理打交道.這些往往會使人受盡折磨.所以如果你想深入c c 程式設計,你必須靜下心來,好好苦一番.現在我們將討論c c 裡我認為哪一本書都沒有完全說清楚,也是涉及概念細節最多,語言中最難的技術之一的動態記憶體的傳遞.並且在軟體開發中很多專業...

傳遞動態記憶體

參考 程式設計師面試寶典 例1 下面的程式執行會有什麼結果?include void getmemory char p,int num int main 執行該程式會崩潰,因為getmemory在這裡不能傳遞動態記憶體,test函式中的str一直都是null。該例中,void getmemory c...