奇怪的const char *行为

时间:2012-10-31 13:15:29

标签: c++ char const

GetTypeName是std :: string,代码如下

printf("%#x\n", proto->GetTypeName().c_str());
printf("%s\n", proto->GetTypeName().c_str());
const char *res = proto->GetTypeName().c_str();
printf("%#x\n",res);
printf("%s\n",res);

生成此输出:

0x90ef78
ValidTypeName
0x90ef78
ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■←ЬЬQщZ

地址总是一样的;以下代码(行是交换)

const char *res = proto->GetTypeName().c_str();
printf("%#x\n",res);
printf("%s\n",res);
printf("%#x\n", proto->GetTypeName().c_str());
printf("%s\n", proto->GetTypeName().c_str());

生成此输出,地址始终不同:

0x57ef78
  Y
0x580850
ValidTypeName

我做错了什么?

strlen(res)

返回无效大小,所以我甚至无法strcpy。

1 个答案:

答案 0 :(得分:5)

YourGetTypeName函数返回一个std :: string,你正在调用c_str来获取指向该字符串中内部数据的指针。

因为它是一个临时的,你返回的std :: string将在语句末尾被删除

const char *res = proto->GetTypeName().c_str();

但你还是指向现在删除的数据。

编辑:将您的代码更改为: -

const std::string& res = proto->GetTypeName(); 

并在printf中的字符串上调用.c_str(),如下所示: -

printf("%#x\n",res.c_str());
printf("%s\n",res.c_str());

将临时值分配给引用会将该临时值的生命周期延长为与引用的生命周期相同...

更好的是,只需使用std :: string和iostream进行打印,并在不必要时停止使用低级别指针进行处理:)