指向指標的指標申請動態記憶體

2021-07-12 01:43:27 字數 1862 閱讀 8418

在《高質量c程式設計指南》中,提到了如果函式的引數是乙個指標,那麼別指望它能申請動態記憶體

**如下:

#include

#include

void getmemory(char *p,int num);

int main()

void getmemory(char *p,int num)

最後的輸出的stu的結果是0,即null。說明p沒有為stu成功申請到動態記憶體,stu仍然是初始化時候的null.

正如《高質量c程式設計指南》書裡說的,問題出在了getmemory()會為引數製作臨時的副本。即,為指標p製作了乙個副本_p,其中_p=p=address,所以_p和p都是指向同一變數的。如下圖所示:

而現在真正執行的是 _p=(char *)malloc(num);所以申請動態記憶體後首位址address1返回給了指標_p,所以說現在_p指向了動態記憶體段了,而p一點改變都沒有,所以stu仍然是null。

所以getmemory函式事實上沒有為stu申請到動態記憶體,相反的,_p作為臨時變數在該函式執行後就被銷毀了,而動態記憶體卻因為沒有free()釋放,出現記憶體洩露。每呼叫一次getmemory函式,就出現一次記憶體洩露。所以不要使用作為函式引數的指標申請動態記憶體。

可以用的方法可以是用指向指標的指標申請動態記憶體。

具體**如下:

#include

#include

void getmemory(char **p,int num);//引數p是二重指標,指向指標的指標

int main()

void getmemory(char **p,int num)

該怎麼理解這個問題呢。首先我們來看下什麼是指向指標的指標。

現在定義了char **p;

所以p是二重的指標,型別為char **,

所以正如一般的指標變數都是放著要訪問的變數的位址,現在,指標變數p裡面放著的正是*p的位址addr_2,

而(*p)的型別是char *,所以它的內容也是放著乙個位址,

就是**p的位址addr_3。而位址addr_3裡面放著的就是乙個char型的變數的值。正如上圖所示的。

好了,現在看一下,引數&stu是怎麼傳遞的,如下圖

現在我們引數的傳遞是&stu=p;那麼按照上面的說法,getmemory函式為p配置的臨時變數_p=p=&stu;那麼*_p也就是stu

所以真正執行的語句*_p=(char *)malloc(num);

也就是執行的stu=(char *)malloc(num);所以說stu已經得到了動態記憶體的首位址了。如下圖。

所以,這次申請動態記憶體是有效的。

這就是指向指標的指標的方式來在子函式裡面申請動態記憶體。

不知道你們理解了沒有,如果覺得有錯誤,歡迎指正,共同學習。謝謝。

一級指標的動態記憶體申請

動態記憶體申請的三大函式 1.void malloc size t,size 特點 申請的記憶體不會被初始化 2.void calloc size t count,size t size 特點 會給申請的記憶體初始化 數字類 初始值為0 字元類 初始值為 0 3.void realloc void ...

指標作為函式引數,申請動態記憶體方法

void getptr int p,int num void main 錯誤的 void getptr int p,int num void main 首先要說明的是int ptr,這時候ptr指向乙個不明確的位址,在這種情況下getptr ptr,10 這一句傳乙個位址給getptr裡面的p指標,...

指標 動態記憶體傳遞

int pi pi 5 上述 是錯誤的,整數指標pi並沒有指向實際的位址,賦的值不知道該放到 去。2.下面哪個能夠成功實現兩個數的交換。1 void swap1 int a,int b 2 void swap2 int a,int b 3 void swap3 int a,int b 4 void ...