C++ char*作为返回值的一些探索

事情是这样的,先看下面一段代码:

int main()
{
	string str = "hell world";
	char* pc = &str[0];
	cout << pc << endl;
	return 0;
}

输出很正常,hello  world。

-------------------------------------------一条没有感情 的分割线--------------------------------------------

PS:看起来一切都很美好,没有一点点问题。

但是此刻看着cout我不由的发问:cout<<c<<endl,为什么直接输出了一个字符串?按照常理不应该输出字符串的首地址吗?百度大佬告诉我,c++中cout和<<对char*做出了一些特殊的处理,为节省大家的时间就直接全输出了。给C++点个赞。

但是,我又有了 一些新的问题。emmm...如果我就想知道字符串首字符的地址该怎么办?

一行代码的事情cout<<&str<<endl;

于是有了下面一段代码:

int main()
{
	string str = "hell world";
	char* pc = &str[0];

	cout << pc << endl;
	cout << &str << endl;

	return 0;
}

你以为一切都结束了吗?

在好奇心的驱使下,我手贱输出了一下&pc..., 从我浅薄的想当然的认为&pc 与 &str的结果会一样:

emmm....,咳咳,最近疫情严重,不该思考这种问题,免得引起头脑发热。

百度大佬又登场了,cout遇见char*自作聪明的输出了整个字符串,要是想获得字符串首字符的地址,需要使用void*来装一下char*,cout无法输出void* 只好输出地址。问题似乎的到了解决。

哈?are you kidding me?

what are you 弄撒嘞?三个不一样的地址是什么鬼哟?这这这都是指向哪里的?不就是字符串首地址嘛,老子直接输出你,不用 cout了。

看起来pv和&str[0]是一样的。

现在可以得出一个结论了:C++里cout太自作聪明了,为了省去我们循环输出字符的麻烦,cout<<pc<<endl;被翻译为输出pc指向的字符串值。这个时候要输出p的指针值就只能先将其转为void *再输出。因为void型, cout没法输出,只能乖乖输出指针。

插一下大佬的回答:https://blog.csdn.net/hairetz/article/details/4129788

此刻还有两个问题:1.&str显示的地址到底是哪里的?2.&pc显示的地址又是那里的?

我想百度都不知道该百度什么了。词穷,百度没给出我答案,我只好去寻求SLAM群里的巨巨佬们。

好了知道了吧,string并不是简单结构,string对象的地址不等于字符串起始地址。

巨佬们果然对C++内存都很了解,我验证了一下。

巨佬说的真对,看,**&pc(够绕的)果然输出是h。果然pc存放的是存放首字符地址的地址。

完美完美,告辞!

告辞

等等!我要记录的是char*作为返回值的问题。

-------------------------------------------一条没有感情 的分割线--------------------------------------------

我们继续接第一条分割线来看。

char* PointChar() {
	string str = "hell world";
	char* pc = &str[0];
	return pc;
}

int main()
{
	string str = "hell world";
	char* pc = &str[0];
	cout << pc << endl;

	cout << PointChar() << endl;

	return 0;
}

乃们看看,这还用说嘛?肯定是输出两条hello world喽。

咳咳,我觉得头部有点发热了。手持两把锟斤拷,口中疾呼烫烫烫,你烫个锤子哟!

经过我仔细的百度之后,茅厕顿开,PointChar()是一个函数对吧,会在栈上开辟一块空间给str,随着这个函数运行完,开辟的空间也会清空,所以函数中pc指向的str就没啦。不能这么搞。

所以该怎么办?怎么办?程序员没对象该怎么办?当然是new一个了,new开堆上的一块空间,就可以长久存在了。

搜得死内,通过new在堆上开辟一块空间,可解决栈清空内存的问题,也可成功返回char*指针,想必其他指针也是这样(我懒得去试了)。

完美,告辞!

---------------------------------------------------------------------------------------------------------------------

究极PS:昨夜令我脱发的一个错误。

运行有时正确有时错误,单步调试也没啥问题,可是你品,你细品,new char(str.length()+1)...

md,new char() 和 strcpy 这两个堆到一起简直令人发指。new char[]这样才对嘛。

告辞!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值