首页 > 解决方案 > 为什么字符串 s = (char*)tag.c_str(); 当标签是字符串时是错误的

问题描述

为什么下面的代码是错误的?

string tag = "hello"; string s = (char*)tag.c_str();

这是什么意思:storing addresses to internal storage of temporary string objects is wrong. 有人可以帮忙吗?在上述转换过程中究竟发生了什么?

标签: c++stringpointerschar

解决方案


对于所示示例,引用的消息是错误的,因为tag它不是“临时字符串对象”,而是一个生命周期比指针更长的变量。这也是错误的,因为指针仅在c_str被调用的完整表达式中使用,因此指针不会被“存储”以备后用。

强制转换char*为不必要的,应该删除。此外,调用 to c_str是不必要的。复制字符串的一种更简单的方法是:

std::string s = tag; 

这是一个错误的程序,它的消息是正确的:

const char* wrong = "wrong"s.c_str(); // don't do this
std::cout << wrong; // kaboom; behaviour of program is undefined

这里存储的是临时字符串对象的内部存储地址,这是错误的,因为临时字符串对象立即被销毁,因此指针无效,因此无用。


推荐阅读