事情是这样的,先看下面一段代码:
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[]这样才对嘛。
告辞!