c++如何傳遞動態記憶體
阿新 • • 發佈:2019-01-26
先看一段程式碼:
#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開闢空間。所以能正確輸出結果。