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

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

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

输出很正常,hello  world。

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

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

C++ char*作为返回值的一些探索_第1张图片

但是此刻看着cout我不由的发问:cout<

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

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

于是有了下面一段代码:

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

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

	return 0;
}

你以为一切都结束了吗?

C++ char*作为返回值的一些探索_第2张图片

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

C++ char*作为返回值的一些探索_第3张图片

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

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

C++ char*作为返回值的一些探索_第4张图片

哈?are you kidding me?

C++ char*作为返回值的一些探索_第5张图片

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

C++ char*作为返回值的一些探索_第6张图片

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

现在可以得出一个结论了:C++里cout太自作聪明了,为了省去我们循环输出字符的麻烦,cout<

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

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

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

C++ char*作为返回值的一些探索_第7张图片

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

C++ char*作为返回值的一些探索_第8张图片

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

C++ char*作为返回值的一些探索_第9张图片

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

完美完美,告辞!

C++ char*作为返回值的一些探索_第10张图片

等等!我要记录的是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喽。

C++ char*作为返回值的一些探索_第11张图片

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

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

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

C++ char*作为返回值的一些探索_第12张图片

C++ char*作为返回值的一些探索_第13张图片

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

完美,告辞!

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

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

C++ char*作为返回值的一些探索_第14张图片

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

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

告辞!

你可能感兴趣的:(C++,程序)