2017-07-20 72 views
0
#include <iostream> 
#include <cstring> 

using namespace std; 

const char * substringAfterLast(const char * str, const char * separator) 
{ 
    if (str == NULL) { 
     return NULL; 
    } 
    else if (str[0] == '\0' || separator == NULL || separator[0] == '\0') { 
     return ""; 
    } 
    else { 
     string ret(str); 
     size_t found = ret.find_last_of(separator); 
     ret = ret.substr(found + 1); 
     cout << "before value = [" << const_cast<char*>(ret.c_str()) << "]" << endl; 
     return const_cast<char*>(ret.c_str()); 
    } 
} 

int main(void) 
{ 
    cout << "after value = [" << substringAfterLast("abc", "a") << "]" << endl;  
} 

結果爲什麼回報前的價值與回報後的價值有差異?

before value = [bc] 
after value = [**gabage value**] 

是否值從內存在函數的結束而消失? 我不明白爲什麼這些值會改變。

+0

請看這裏:https://stackoverflow.com/questions/6456359/what-is-stdstringc-str-lifetime – meowgoesthedog

回答

1

您從c_str()獲取的指針爲嚴格爲 a const char*類型。此外,它僅在支持字符串ret的生命週期的較早時刻或以任何方式修改ret時纔有效。

任何不符合這些原則的代碼(如您的)的行爲是undefined