C++中string转换为char*类型返回后乱码问题解决

2020-07-06 12:00:14王冬梅

问题来源:

在写二叉树序列化与反序列化时发现序列化函数为char* Serialize1(TreeNode *root)  其函数返回类型为char*,但是我在实现的过程中为了更方便的操作添加字符串使用的是C++中string类型的变量,这就导致我最后得到的结果res是string类型,若是要返回需要转化为char *类型。而等我将string类型转为char*后返回在主函数中就成了乱码。

先直接说最后的解决办法:

第一种:定义一个char数组,数组长度为stringlength+1,将string的内容依次赋值给char数组,最后加上'' ,然后返回char数组名就行了。

第二种:将string定义为类的成员变量

就贴第一种方法的代码

char *result = new char[res.length() + 1];  //定义需要返回的result对象
for (int i = 0; i < res.length(); ++i)
{
   result[i] = res[i];    //将string类型的res内容都放到result内
}
result[res.length()] = '';  //加上结束符

再说说我尝试的方法

尝试1:

一开始我是直接定义char *result=&res[0];想要通过这个语句直接返回这个string类型变量的首地址,但是失败了,在主函数中的结果变量是乱码 "葺葺葺葺葺葺葺葺葺葺"

尝试2:

于是我开始思考可能的原因

1.考虑到局部变量可能随着函数释放,因此导致我返回的指针指向的内容随着函数一起释放导致了乱码,但一想到平时写的函数都是正常返回的,所以这个我很快否决了,但最后发现这个思路是对的。至于平常写的函数都是正常返回则是因为没有涉及到类型转换。

2.通过VS的调试发现我使用的char *result=&res[0]语句返回的是res的首个元素地址,并不是res的首地址,因为string作为std封装的数据结构除了char*这种从C吸收过来的结构还有内存分配allocate这些东西所以导致其内存地址并不像char数组那样是首个元素地址

所以我想干脆把整个string类型的res都赋值给char *类型的result

所以我尝试了char *result=(char*)res.data();语句,将res(res是string类型的结果)赋给result,转换是成功的,但返回值依旧失效(且这种转换需要自己加上结束符)

然后尝试char *result=(char*)res.c_str();结果也是成功的,但返回值依旧失效。

最后尝试,用new新建一个char数组,将res的内容全部拷贝到char数组内,然后将数组名返回,终于成功。

问题根源

通过VS调试我最终发现了问题根源所在:res所占内存随着函数结束而被释放

这是函数未执行完的调试界面

这是执行完调试界面

很明显:res没有了,在函数执行完毕后res内存也跟着被释放了而char数组result却仍然存在。他们的不同点在哪:result是返回值