最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中string轉(zhuǎn)換為char*類型返回后亂碼問題解決

 更新時(shí)間:2020年07月06日 08:21:54   作者:加菲貓不加肥誒  
這篇文章主要介紹了C++中string轉(zhuǎn)換為char*類型返回后亂碼問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

問題來源:

在寫二叉樹序列化與反序列化時(shí)發(fā)現(xiàn)序列化函數(shù)為char* Serialize1(TreeNode *root)  其函數(shù)返回類型為char*,但是我在實(shí)現(xiàn)的過程中為了更方便的操作添加字符串使用的是C++中string類型的變量,這就導(dǎo)致我最后得到的結(jié)果res是string類型,若是要返回需要轉(zhuǎn)化為char *類型。而等我將string類型轉(zhuǎn)為char*后返回在主函數(shù)中就成了亂碼。

先直接說最后的解決辦法:

第一種:定義一個(gè)char數(shù)組,數(shù)組長(zhǎng)度為stringlength+1,將string的內(nèi)容依次賦值給char數(shù)組,最后加上'\0' ,然后返回char數(shù)組名就行了。

第二種:將string定義為類的成員變量

就貼第一種方法的代碼

char *result = new char[res.length() + 1];  //定義需要返回的result對(duì)象
for (int i = 0; i < res.length(); ++i)
{
   result[i] = res[i];    //將string類型的res內(nèi)容都放到result內(nèi)
}
result[res.length()] = '\0';  //加上結(jié)束符\0

再說說我嘗試的方法

嘗試1:

一開始我是直接定義char *result=&res[0];想要通過這個(gè)語句直接返回這個(gè)string類型變量的首地址,但是失敗了,在主函數(shù)中的結(jié)果變量是亂碼 "葺葺葺葺葺葺葺葺葺葺"

嘗試2:

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

1.考慮到局部變量可能隨著函數(shù)釋放,因此導(dǎo)致我返回的指針指向的內(nèi)容隨著函數(shù)一起釋放導(dǎo)致了亂碼,但一想到平時(shí)寫的函數(shù)都是正常返回的,所以這個(gè)我很快否決了,但最后發(fā)現(xiàn)這個(gè)思路是對(duì)的。至于平常寫的函數(shù)都是正常返回則是因?yàn)闆]有涉及到類型轉(zhuǎn)換。

2.通過VS的調(diào)試發(fā)現(xiàn)我使用的char *result=&res[0]語句返回的是res的首個(gè)元素地址,并不是res的首地址,因?yàn)閟tring作為std封裝的數(shù)據(jù)結(jié)構(gòu)除了char*這種從C吸收過來的結(jié)構(gòu)還有內(nèi)存分配allocate這些東西所以導(dǎo)致其內(nèi)存地址并不像char數(shù)組那樣是首個(gè)元素地址

所以我想干脆把整個(gè)string類型的res都賦值給char *類型的result

所以我嘗試了char *result=(char*)res.data();語句,將res(res是string類型的結(jié)果)賦給result,轉(zhuǎn)換是成功的,但返回值依舊失效(且這種轉(zhuǎn)換需要自己加上\0結(jié)束符)

然后嘗試char *result=(char*)res.c_str();結(jié)果也是成功的,但返回值依舊失效。

最后嘗試,用new新建一個(gè)char數(shù)組,將res的內(nèi)容全部拷貝到char數(shù)組內(nèi),然后將數(shù)組名返回,終于成功。

問題根源

通過VS調(diào)試我最終發(fā)現(xiàn)了問題根源所在:res所占內(nèi)存隨著函數(shù)結(jié)束而被釋放

這是函數(shù)未執(zhí)行完的調(diào)試界面

這是執(zhí)行完調(diào)試界面

很明顯:res沒有了,在函數(shù)執(zhí)行完畢后res內(nèi)存也跟著被釋放了而char數(shù)組result卻仍然存在。他們的不同點(diǎn)在哪:result是返回值

我們知道函數(shù)的函數(shù)棧知識(shí)點(diǎn),棧內(nèi)存放著函數(shù)入口地址,局部變量,返回地址等,我猜測(cè)result作為要被返回的對(duì)象其內(nèi)存空間應(yīng)該是不隨著函數(shù)一起被釋放的,也就是主函數(shù)內(nèi)的返回值應(yīng)該還是用那塊內(nèi)存,經(jīng)過測(cè)試這個(gè)結(jié)論是對(duì)的。主函數(shù)中的變量的確是使用返回值那塊內(nèi)存。

到這里就發(fā)現(xiàn)了,雖然執(zhí)行char* result=(char*)res.c_str()語句能讓result內(nèi)是完整的結(jié)果內(nèi)容(也就是轉(zhuǎn)換完成),但result會(huì)隨著string類型的res的釋放而導(dǎo)致char*類型的result所指向的內(nèi)存空間內(nèi)容全部清空。最后雖然返回了result所指的空間但里面的內(nèi)容早就被清空了。就好比把內(nèi)存比作一塊地,res先在其上面蓋了一座房子,而使用上面轉(zhuǎn)換語句后result也是房子的主人,這下房子有了兩個(gè)主人,他們都能對(duì)房子進(jìn)行操作。正因?yàn)樗麄兌寄苓M(jìn)行操作,當(dāng)他們所屬函數(shù)結(jié)束也就是res大限到來之時(shí),res將自己建立的房子銷毀了。那么result也就沒有房子可住了。也就是他們公用的那片內(nèi)存被初始化,這時(shí)主函數(shù)雖然收到了返回地址但那片地址已經(jīng)沒有內(nèi)容了。也就導(dǎo)致亂碼了。

到這里,問題的根源就知道了,那么解決方法也就很明顯了:1.內(nèi)存分離,將res和result的所屬內(nèi)存地址分開。2.或者想辦法讓res所在內(nèi)存不隨著函數(shù)結(jié)束而釋放.

具體實(shí)現(xiàn):

第1種.上面那段new新建char*變量的代碼。為result重新開辟一段空間。

第2種.i:若在類里:將res設(shè)為類的成員變量或者static成員變量(最好不要,能成功但會(huì)有新問題出現(xiàn)),他們都不會(huì)隨著成員函數(shù)的結(jié)束而釋放。區(qū)別就是普通成員變量會(huì)隨著對(duì)象的釋放而釋放,static不會(huì),它是存放在靜態(tài)存儲(chǔ)區(qū)

ii:若是像C這類面向過程代碼就是將res設(shè)為全局變量即可

到此這篇關(guān)于C++中string轉(zhuǎn)換為char*類型返回后亂碼問題解決的文章就介紹到這了,更多相關(guān)C++中string轉(zhuǎn)換為char*類型亂碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言實(shí)現(xiàn)單位車輛調(diào)度管理

    C語言實(shí)現(xiàn)單位車輛調(diào)度管理

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)單位車輛調(diào)度管理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語言實(shí)現(xiàn)掃雷游戲詳細(xì)代碼

    C語言實(shí)現(xiàn)掃雷游戲詳細(xì)代碼

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)掃雷游戲的具體步驟和詳細(xì)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • C/C++判斷素?cái)?shù)的三種方法

    C/C++判斷素?cái)?shù)的三種方法

    這篇文章主要給大家介紹了C/C++判斷素?cái)?shù)的三種方法,常規(guī)的函數(shù)判斷法,埃氏篩法和歐拉篩法這三種方法,并通過代碼示例講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-12-12
  • CreateCompatibleDC()函數(shù)案例詳解

    CreateCompatibleDC()函數(shù)案例詳解

    這篇文章主要介紹了CreateCompatibleDC()函數(shù)案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 如何利用C語言位運(yùn)算解決只出現(xiàn)一次的數(shù)字

    如何利用C語言位運(yùn)算解決只出現(xiàn)一次的數(shù)字

    這篇文章主要給大家介紹了關(guān)于如何利用C語言位運(yùn)算解決只出現(xiàn)一次的數(shù)字的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • CFileDialog設(shè)置多選的問題解決

    CFileDialog設(shè)置多選的問題解決

    前幾天同事問我在CFileDialog中多選時(shí)按確定按鈕后DoModal函數(shù)的返回值是IDCANCEL的問題解決
    2013-02-02
  • 純C語言實(shí)現(xiàn)五子棋

    純C語言實(shí)現(xiàn)五子棋

    本文給大家分享的是去年制作的一個(gè)純C語言實(shí)現(xiàn)的五子棋的代碼,雖然沒有帶漂亮的界面,還是推薦給大家,有需要的小伙伴可以參考下。
    2015-03-03
  • C語言函數(shù)調(diào)用基礎(chǔ)應(yīng)用詳解

    C語言函數(shù)調(diào)用基礎(chǔ)應(yīng)用詳解

    函數(shù)就是一段封裝好的,可以重復(fù)使用的代碼,它使得我們的程序更加模塊化,不需要編寫大量重復(fù)的代碼。這篇文章主要介紹了c語言是如何處理函數(shù)調(diào)用的?需要的朋友可以參考下
    2023-02-02
  • C語言代碼詳細(xì)描述順序線性表

    C語言代碼詳細(xì)描述順序線性表

    這篇文章主要用代碼介紹了C語言線性表的順序線性表,對(duì)于學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法的朋友很有參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • NDK 數(shù)據(jù)結(jié)構(gòu)之隊(duì)列與棧等的實(shí)現(xiàn)

    NDK 數(shù)據(jù)結(jié)構(gòu)之隊(duì)列與棧等的實(shí)現(xiàn)

    這篇文章主要介紹了NDK 數(shù)據(jù)結(jié)構(gòu)之隊(duì)列與棧等的實(shí)現(xiàn)的相關(guān)資料,希望通過本文大家能理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10

最新評(píng)論

宁阳县| 沛县| 山东省| 玉龙| 江门市| 永昌县| 永新县| 克拉玛依市| 平顺县| 惠州市| 准格尔旗| 夹江县| 页游| 郴州市| 巩留县| 依兰县| 松原市| 南汇区| 绥滨县| 永修县| 孝义市| 仙游县| 额济纳旗| 常熟市| 邢台市| 于都县| 桃园市| 即墨市| 昌平区| 东宁县| 星子县| 瑞昌市| 洛扎县| 汕头市| 磐石市| 遂溪县| 延长县| 嘉兴市| 三亚市| 承德市| 青冈县|