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 }
運行截圖:
關於指針引用方法的流程圖以下:
能力有限,不免有沒說清楚的地方,還望包涵。