为什么返回前的值与返回后的值之间存在差异?

时间:2017-07-20 09:15:55

标签: c++ stdstring

#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**]

该值在函数末尾从内存中消失了吗? 我不明白为什么这些价值会发生变化。

1 个答案:

答案 0 :(得分:1)

您从c_str()返回的指针是严格 const char*类型。此外,它仅在支持字符串ret的生命周期的早期或以任何方式修改ret时有效。

任何不遵守这些原则的代码(例如您的代码)的行为都是未定义