欧博电脑版下载:C++中string转换为char*类型返回后乱码问题

admin 3个月前 (07-06) 科技 34 0

问题泉源:

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

 

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

  第一种:界说一个char数组,数组长度为stringlength+1,将string的内容依次赋值给char数组,最后加上'\0' ,然后返回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()] = '\0';  //加上竣事符\0

 

再说说我实验的方式

实验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,转换是乐成的,但返回值依旧失效(且这种转换需要自己加上\0竣事符)

  然后实验char *result=(char*)res.c_str(); 效果也是乐成的,但返回值依旧失效。

  最后实验,用new新建一个char数组,将res的内容所有拷贝到char数组内,然后将数组名返回,终于乐成。

 

问题泉源

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

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

  这是执行完调试界面

 

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

  我们知道函数的函数栈知识点,栈内存放着函数入口地址,局部变量,返回地址等,我预测result作为要被返回的工具其内存空间应该是不随着函数一起被释放的,也就是主函数内的返回值应该照样用那块内存,经由测试这个结论是对的。主函数中的变量的确是使用返回值那块内存。

  到这里就发现了,虽然执行char* result=(char*)res.c_str()语句能让result内是完整的效果内容(也就是转换完成),但result会随着string类型的res的释放而导致char*类型的result所指向的内存空间内容所有清空。最后虽然返回了result所指的空间但内里的内容早就被清空了。就好比把内存比作一块地,res先在其上面盖了一座屋子,而使用上面转换语句后result也是屋子的主人,这下屋子有了两个主人,他们都能对屋子举行操作。正由于他们都能举行操作,当他们所属函数竣事也就是res大限到来之时,res将自己确立的屋子销毁了。那么result也就没有屋子可住了。也就是他们公用的那片内存被初始化,这时主函数虽然收到了返回地址但那片地址已经没有内容了。也就导致乱码了。

  到这里,问题的泉源就知道了,那么解决方式也就很明显了:1.内存星散,将res和result的所属内存地址离开。2.或者想办法让res所在内存不随着函数竣事而释放.

  详细实现:

  第1种.上面那段new新建char*变量的代码。为result重新开拓一段空间。

  第2种.i:若在类里:将res设为类的成员变量或者static成员变量(最好不要,能乐成但会有新问题泛起),他们都不会随着成员函数的竣事而释放。区别就是通俗成员变量会随着工具的释放而释放,static不会,它是存放在静态存储区

      ii:若是像C这类面向历程代码就是将res设为全局变量即可

 

,

欧博官网手机

欢迎进入欧博官网手机(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。

Allbet声明:该文看法仅代表作者自己,与本平台无关。转载请注明:欧博电脑版下载:C++中string转换为char*类型返回后乱码问题

网友评论

  • (*)

最新评论

文章归档

站点信息

  • 文章总数:762
  • 页面总数:0
  • 分类总数:8
  • 标签总数:1359
  • 评论总数:351
  • 浏览总数:33055