GetTypeName().c_str()); printf("%s\n", proto->Ge-6ren">
gpt4 book ai didi

c++ - 奇怪的 const char* 行为

转载 作者:太空狗 更新时间:2023-10-29 20:44:30 25 4
gpt4 key购买 nike

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。

最佳答案

您的 GetTypeName 函数正在返回一个 std::string 并且您正在调用 c_str 以获取指向该字符串中的内部数据的指针。

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

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

但是您仍然有 res 指向现在已删除的数据。

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

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

然后像这样在 printf 中的那个字符串上调用 .c_str() :-

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

将临时对象分配给引用可延长该临时对象的生命周期,使其与引用的生命周期相同...

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

关于c++ - 奇怪的 const char* 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13158842/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com