c++如何傳遞動態內存

先看一段代碼:

#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開闢空間。所以能正確輸出結果。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章