關於在函數中返回動態的內存

1.有如下題目:ios

 1 #include <iostream>
 2 using namespace std;
 3 
 4 void GetMemeory(char* p)
 5 {
 6     p=(char*)malloc(sizeof(char)*100);
 7 }
 8 
 9 int main()
10 {
11     char *str=NULL;
12     GetMemeory(str);
13     strcpy(str,"Thunder");
14     strcat(str,"Downloader");
15     printf(str);
16     system("pause");
17     return 0;
18 }

咱們指望的輸出是:ThunderDownloader函數

然而當咱們運行此段代碼的時候發現,程序崩潰了。spa

 

其實咱們深刻分析下不難發現,當咱們傳入str到GetMemeory()函數中的時候,該函數咱們建立了一個臨時3d

的指針變量片p,而後將其指向NULL。而後咱們爲臨時指針變量p動態分配內存,注意,當咱們在返回的時候指針

整個臨時指針變量是釋放掉的,由於其內存是在棧內存中分配的。可是咱們以前傳入的str的內存地址與臨時變量code

的內存地址是不相同的。因此此時str不能獲取在函數GetMemmory分配的內存,所以後面的字符串複製和連接操做blog

都將形成程序崩潰。內存

 

咱們能夠用下面的圖形更加生動的這一過程:字符串

假設str自己內存爲0x123  臨時指針變量p的內存爲0x456  動態分配的內存起始地址爲0x789io

當GetMemory函數結束的時候p被釋放,而再也無指針指向這塊動態分配的內存了。另外str也不可能

獲取這段動態分配的內存的地址。因此也形成了內存泄露。

 

咱們能夠用以下兩種方法解決這一問題:

一種是二級指針:

 1 #include <iostream>
 2 using namespace std;
 3 
 4 void GetMemeory(char** p)
 5 {
 6     (*p)=(char*)malloc(sizeof(char)*100);
 7 }
 8 
 9 int main()
10 {
11     char *str=NULL;
12     GetMemeory(&str);
13     strcpy(str,"Thunder");
14     strcat(str,"Downloader");
15     printf(str);
16     system("pause");
17     return 0;
18 }

運行截圖爲:

關於二級指針的方法能夠參考以下的流程圖:

 

 

 

 

一種是指針的引用方法:

 1 #include <iostream>
 2 using namespace std;
 3 
 4 void GetMemeory(char*& p)
 5 {
 6     p=(char*)malloc(sizeof(char)*100);
 7 }
 8 
 9 int main()
10 {
11     char *str=NULL;
12     GetMemeory(str);
13     strcpy(str,"Thunder");
14     strcat(str,"Downloader");
15     printf(str);
16     system("pause");
17     return 0;
18 }

運行截圖:

關於指針引用方法的流程圖以下:

 

能力有限,不免有沒說清楚的地方,還望包涵。

相關文章
相關標籤/搜索