C++中return作用于s.c_str()时返回结果出现乱码
- C/C++ code
#include <iostream>#include <string>using namespace std;string strcatEx(const char *c1, const char *c2){ string s1="",s2=""; if(c1) s1=c1; if(c2) s2=c2; return (s1+s2);}const char *pstrcatEx(const char *c1, const char *c2){ string s=strcatEx(c1, c2); return s.c_str();}const char *pstrcatEx2(const char *c1, const char *c2){ string s1="",s2=""; if(c1) s1=c1; if(c2) s2=c2; string s=s1+s2; return s.c_str();}int main(int argc, char* argv[]){ char *c11="a12",*c12="a21a"; cout<<strcatEx(c11, c12)<<endl; cout<<strcatEx(c11, c12).c_str()<<endl; cout<<pstrcatEx(c11, c12)<<endl; cout<<pstrcatEx2(c11, c12)<<endl; return 0;}//运行结果://VC++6.0 Debugcout<<strcatEx(c11, c12)<<endl; // a12a21acout<<strcatEx(c11, c12).c_str()<<endl; // a12a21acout<<pstrcatEx(c11, c12)<<endl; //葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺cout<<pstrcatEx2(c11, c12)<<endl; //葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺//VC++ 6.0 Releasecout<<strcatEx(c11, c12)<<endl; // a12a21acout<<strcatEx(c11, c12).c_str()<<endl; // a12a21acout<<pstrcatEx(c11, c12)<<endl; // a12a21acout<<pstrcatEx2(c11, c12)<<endl; //(一个笑脸标志)8//C-Free(MinGW5) Debug/Releasecout<<strcatEx(c11, c12)<<endl; // a12a21acout<<strcatEx(c11, c12).c_str()<<endl; // a12a21acout<<pstrcatEx(c11, c12)<<endl; // a12a21acout<<pstrcatEx2(c11, c12)<<endl; // a12a21a//strcatEx(c11, c12).c_str();正常,说明不是c_str()的问题//VC++6.0下通过调试和设置输出发现:string s=strcatEx(c1, c2); //正常string s=s1+s2; //正常s.c_str(); //正常//出现问题的地方应该是 return 作用于 s.c_str() 时,//返回的const char *pstrcatEx和const char *pstrcatEx2不正常我的问题:(在VC++6.0下)
1. cout<<pstrcatEx(c11, c12)<<endl;为什么在两种模式下结果不一样
2. pstrcatEx和pstrcatEx2执行的代码本质是相同的,为什么结果不同
[解决办法]
第二个和第三个函数都返回了本地string的c_str,在函数返回后这个string对象会析构,它的c_str是未定义的行为。