使用const char获取错误

时间:2014-03-10 15:58:54

标签: c++ string char const

我正在尝试实现下面的函数,但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;
}

5 个答案:

答案 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获取的指针。

您可以通过两种方式解决问题 -

  1. append的值返回std :: string。
  2. 传递给append指针以填充数据 -
  3. 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;
    }