C++函数返回字符串指针的临时变量

情景

假设有函数getname(),且其返回值为一个字符串指针。在函数体内部,定义字符串数组char temp[10]来接受外界输入。因为temp为自动变量,getname()一旦结束后其就会消亡。但是如果该函数最后返回temp数组的首地址作为返回值,会发生什么呢?
注1:如果直接使用char* temp而不是char temp[10],则需要首先对temp初始化,但是这样temp直接变成const char*,后期无法对其进行赋值。

对于一般的整型、实型临时变量,即使其生命期结束,也能够正常地将值返回给外界函数;对于类的对象,结束时会调用类的拷贝函数,通过建立新的临时对象完成对象的传递,完成传递后自动释放相应内存。但是对于字符串指针的情况我尚不明确,下面进行探索。

程序1

本段程序直接返回临时指针变量

#include <iostream>
#include <cstring>
using namespace std;

//连续输入5个字符串,最大长度为9
char* getname()
{
	char temp[10];
	cout << "\n\tinput a word, plz" << endl;
	cin >> temp;
	return temp;  //直接返回临时变量
}


int main()
{
	for (int i = 0; i < 5; i++)
		cout << "the word is: " << getname() << endl;
	return 0;
}

运行结果
在这里插入图片描述
可以看到完全不行。下面对程序进行修改,使得返回的值不再是临时指针,而是在函数内部就用new开辟相应的内存空间。

程序2

#include <iostream>
#include <cstring>
#pragma warning(disable:4996)
//否则老说我strcpy不安全
using namespace std;

//连续输入5个字符串,最大长度为10,使用new节省空间,用指针完成
char* getname()
{
	char temp[10];
	cout << "\n\tinput a word, plz" << endl;
	cin >> temp;
	char* p = new char[strlen(temp) + 1];
	//用new开辟出了新的内存空间
	strcpy(p, temp);
	return p; 
}

int main()
{
	for (int i = 0; i < 5; i++)
	{
		char* name = getname();
		cout << "the word is: " << name << endl;
		cout << "the address is: " << (int*)name << endl << endl;
		delete[]name; //别忘了delete
	}
	return 0;
}

运行结果:
在这里插入图片描述
成功了!要提示的是deletenew不在一个函数里还是别忘掉匹配;另外delete的是地址,而不一定非要是原来的指针变量。所以说当主函数中name通过=得到了new出来的的地址之后,直接对name delete也是可以的。重复delete和不delete都是非常不好的。
另外这个程序看上去确实有点拧巴…我只是想顺便把newdelete复习一下,如果有人看到的话,见笑了…

最后

这是我的第一篇博客这样,最近自己在看C++ Primer Plus,所以就想把自己的一点想法记录下来,以后也可以看。但!是!我是初学者,一来不知道自己写的博客对不对,二来不知道能不能给大家提供帮助(> <)所以说欢迎大佬们的批评指正!!!谢谢大家

啊 这么一篇小文章我就写了快一个小时…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值