我不知道但是当我尝试从返回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);
答案 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() );
或者更好的是,忘记使用字符指针。