我正在尝试实现下面的函数,但foo()的输出是一堆废话。我试图运行调试器,并没有在append函数中看到任何问题。但是foo()中的总变量未正确赋值“abcdef”。有什么想法吗?
int main()
{
cout<<"foo is"<<endl;
foo();
return 0;
}
const char* append(const char* s1, const char* s2) {
string s(s1);
s += s2;
return s.c_str();
}
void foo() {
const char* total = append("abc", "def");
cout<<total;
}
答案 0 :(得分:6)
因为在append()
中,您返回了s.c_str()
;然后,s
被破坏,这意味着返回的指针立即失效。
让append()
返回std::string
来解决此问题。
std::string append(const char* s1, const char* s2) {
return std::string(s1).append(s2);
}
void foo() {
std::string total = append("abc", "def");
cout << total;
}
答案 1 :(得分:4)
未定义的行为。 c_str
仅在s
的生命周期内有效(并且只有在s
未以任何方式修改时才会生效)。 {0}返回append
后,s
超出范围。的轰!强>
一种解决方法是让append
返回std::string
。
答案 2 :(得分:1)
const char* append(const char* s1, const char* s2) {
string s(s1);
s += s2;
return s.c_str();
}
变量s
是函数的本地变量。它在函数返回时被销毁。这意味着您返回的值s.c_str()
指向已释放的内存。取消引用该内存会导致未定义的行为。
松散地说,带有c_str()
的规则,它返回的值保证在字符串对象被修改或销毁之前有效。
简单地说,你应该停止使用C字符串,除非你需要使用它们进行互操作。你的功能应该是:
string append(const string& s1, const string& s2)
{
return s1 + s2;
}
答案 3 :(得分:0)
您正在返回append()
的指针,该指针在函数返回时无效。
string s(s1);
在append()
中定义一个对象。从函数返回时会被销毁。因此,s.c_str()
的返回值在foo
中无效。
您可以将代码更改为:
string append(const char* s1, const char* s2) {
string s(s1);
s += s2;
return s;
}
void foo() {
string total = append("abc", "def");
cout<<total;
}
这应该有效。
答案 4 :(得分:0)
return s.c_str();
:返回从临时变量s
获取的指针。
您可以通过两种方式解决问题 -
append
的值返回std :: string。append
指针以填充数据 - void append(const char* s1, const char* s2, char* out) { string s(s1); s += s2; strncpy(out, s.c_str(), s.size()+1); } void foo() { char total[7] = {0}; //should be enough to carry appended string + '\0' append("abc", "def", total); cout<<total; }