如何设置std字符串(c_str())中的char *值不起作用

时间:2011-05-10 08:16:21

标签: c++ string pointers

我不知道但是当我尝试从返回std字符串的函数设置char *值时,这对我来说无法获取垃圾值:

string foo()
{
  string tmp ="dummy value";
  return tmp;
}

char* cc = (char *) foo().c_str(); // if i remove the casting im getting error 
// when i print the cc i get garbage 
printf("%s",cc);

5 个答案:

答案 0 :(得分:13)

cc指向的数据的生命周期与它来自的字符串的生命周期相同(充其量 - 如果你修改字符串它甚至更短)。

在您的情况下,foo()的返回值是在cc初始化结束时销毁的临时值。

为了避免char *cc = foo().c_str()中的编译错误,您不应该转为char*,您应切换到const char *cc,因为const char*c_str()返回的内容。但是,这仍然无法解决主要问题。

最简单的修复方法是:

printf("%s", foo().c_str()); // if you don't need the value again later

const string s = foo();
const char *cc = s.c_str();  // if you really want the pointer - since it's
                             // in the same scope as s, and s is const,
                             // the data lives as long as cc's in scope.

string s = foo();
printf("%s", s.c_str());     // if you don't store the pointer,
                             // you don't have to worry about it.

std::cout << foo(); // printf isn't bringing much to this party anyway.

答案 1 :(得分:9)

foo的结果是一个临时对象,在char * cc = ...行的末尾被破坏。将其存储在常量参考中:

const string& cc = foo();
printf ("%s", cc.c_str());

答案 2 :(得分:1)

将内存位置传递给foo()并让foo修改:

void foo (string* _out_newStr)
{
    _out_newStr->assign("dummy string"); //This is wrong -> _out_newStr = "dummy string";
    return;
}

然后,当您使用字符串对象的“c_str()”函数时,您将返回一个const char *值,如已经指出的那样。

答案 3 :(得分:0)

代码片段调用未定义的行为,因为从调用创建的临时std::string在表达式的末尾被销毁,但指向被销毁对象的cc仍在使用之后这一点。

答案 4 :(得分:0)

怎么样:

printf("%s", foo.c_str() );

或者更好的是,忘记使用字符指针。