当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用表达式初始化char*不起作用》经验,为你挑选了1个好方法。

以下代码生成错误的输出:

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

为什么?在我初始化时my_pointer,我认为my_pointer=new char[100]不需要.如果这个假设不正确,为什么呢?



1> songyuanyao..:

请注意,这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();

BTW:std :: basic_string :: c_str的返回类型是const char*,对它的任何修改都是UB.所以试图char*明确地将其转换是危险的.

写入通过的字符数组c_str()是未定义的行为.

推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有