#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 :(得分:1)
您从c_str()
返回的指针是严格 const char*
类型。此外,它仅在支持字符串ret
的生命周期的早期或以任何方式修改ret
时有效。
任何不遵守这些原则的代码(例如您的代码)的行为都是未定义。