亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么在返回字符串的函數上調用c_str()無效?

為什么在返回字符串的函數上調用c_str()無效?

C++
森欄 2019-11-04 09:56:21
我有一個返回字符串的函數。但是,當我調用它并對其執行c_str()將其轉換為const char *時,它只有在我首先將其存儲到另一個字符串中時才起作用。如果我直接從函數中調用c_str(),它將垃圾值存儲在const char *中。為什么會這樣呢?感覺我在這里錯過了一些非常基本的東西...string str = SomeFunction();const char* strConverted = str.c_str(); // strConverted stores the value of the string properlyconst char* charArray= SomeFunction().c_str(); // charArray stores garbage valuestatic string SomeFunction(){    string str;    // does some string stuff    return str;}
查看完整描述

3 回答

?
SMILET

TA貢獻1796條經驗 獲得超4個贊

函數返回的值對象是臨時的。的結果c_str()僅在臨時生存期內有效。在大多數情況下,臨時項的生存期到完整表達式的結尾(通常是分號)。


const char *p = SomeFunction();

printf("%s\n", p); // p points to invalid memory here.

解決方法是確保c_str()在完整表達式結束之前使用的結果。


#include <cstring>


char *strdup(const char *src_str) noexcept {

    char *new_str = new char[std::strlen(src_str) + 1];

    std::strcpy(new_str, src_str);

    return new_str;

}


const char *p = strdup(SomeFunction.c_str());

請注意,這strdup是POSIX函數,因此,如果您是支持POSIX的平臺,那么它已經存在。


查看完整回答
反對 回復 2019-11-04
?
滄海一幻覺

TA貢獻1824條經驗 獲得超5個贊

  1. 的“ string str”在方法SomeFunction()是在一個局部變量SomeFunction(),和僅存活的范圍內SomeFunction();

  2. 由于該方法的返回類型SomeFunction()是字符串,而不是字符串的引用,因此在“ return str;”之后SomeFunction()將返回的值的副本,該副本str將作為臨時值存儲在內存中的某個位置,在調用后SomeFunction(),該臨時價值將立即被銷毀;

  3. “ string str = SomeFunction();”將存儲返回SomeFunction()到字符串的臨時值str,實際上是該值的副本并存儲到str,分配了一個新的存儲塊,并且“ ”的調用后的生存期str大于返回的臨時值。完成后,返回的臨時值立即被銷毀,內存由系統回收,但此值的副本仍存儲在中。這就是為什么“ ”可以獲取正確的值,實際上返回的是初始元素的指針(指向的字符串值的第一個元素存儲地址),而不是返回的臨時值;SomeFunction();SomeFunction()strconst char* strConverted = str.c_str();c_str()strstrSomeFunction()

  4. “ const char* charArray= SomeFunction().c_str();”是不同的,“ SomeFunction().c_str()”將返回返回的臨時值的初始元素的指針(返回的臨時字符串值的第一個元素內存地址),但是在調用之后SomeFunction(),返回的臨時值被破壞,并且該內存地址由系統重用,charArray可以獲取該內存地址的值,但不能獲取您期望的值;


查看完整回答
反對 回復 2019-11-04
  • 3 回答
  • 0 關注
  • 765 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號