先看一段代碼:
#include<iostream>
using namespace std;
void GetMe(char *p,int num)
{
p=(char*)malloc(sizeof(char)*num);
}
int main()
{
char *str=NULL;
GetMe(str,100);
strcpy(str,"Hello!");
cout<<str<<endl;
return 0;
}
該代碼運行崩潰,原因是str並沒有實際獲得指針p開闢的內存空間。在函數GetMe中,p實際上是主函數中str的一個副本,p申請了內存,只是把p指向的內存地址改變,而str並沒有改變,所以str依然沒有獲得內存,在執行字符串複製時就會出錯。而且每次p申請的內存都不會得到釋放,最終會造成內存泄露。
我們可以更改以上代碼如下:
#include<iostream>
using namespace std;
char* GetMe(char *p,int num)
{
p=(char*)malloc(sizeof(char)*num);
return p;
}
int main()
{
char *str=NULL;
str=GetMe(str,100);
strcpy(str,"Hello!");
cout<<str<<endl;
delete str;
return 0;
}
在該代碼中我們爲p申請了空間,並將該空間的地址作爲返回值傳給str,這樣str就指向了p申請的內存空間。還有一種修改方法是:傳遞str的指針:
#include<iostream>
using namespace std;
void GetMe(char **p,int num)
{
*p=(char*)malloc(sizeof(char)*num);
}
int main()
{
char *str=NULL;
GetMe(&str,100);
strcpy(str,"Hello!");
cout<<str<<endl;
delete str;
return 0;
}
在該代碼中傳遞了str的指針給函數GetMe(),那麼p就是str的地址的副本,地址的副本可定就是該地址了,所以該函數是爲str地址指向的str開闢空間。所以能正確輸出結果。