gpt4 book ai didi

c++ - 使用表达式初始化 char * 不起作用

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:05:25 25 4
gpt4 key购买 nike

以下代码产生了错误的输出:

string my_string="My_First_Text";
char * my_pointer=(char *)(my_string+"My_Second_Text").c_str();

为什么?当我初始化 my_pointer 时,我假设不需要 my_pointer=new char[100]。如果这个假设不成立,那为什么呢?

最佳答案

注意my_string+"My_Second_Text"是一个临时的std::string,会在表达式后立即销毁。这意味着 my_pointer 将立即悬垂,因为它应该指向的 char 数组已随着临时 std::string 的销毁而被销毁;请注意,返回的 char 数组属于 std::string,它不是独立的。然后,对悬挂指针的尊重将导致 UB。

string my_string="My_First_Text";
char * my_pointer=(char *)(my_string+"My_Second_Text").c_str();
// the temporary constructed from my_string+"My_Second_Text" has been destroyed
// my_pointer is dangled now; deference on it is UB

使用命名变量而不是临时变量就可以了。例如

string my_string = "My_First_Text";
my_string += "My_Second_Text";
const char * my_pointer = my_string.c_str();

顺便说一句:std::basic_string::c_str 的返回类型是const char*,对它的任何修改都是UB。因此,尝试将其显式转换为 char* 是危险的。

Writing to the character array accessed through c_str() is undefined behavior.

关于c++ - 使用表达式初始化 char * 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41788170/

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