[英]Is it safe to use std::string::c_str() to modify the underlying std::string?
我遇到了一些代码,其中包含以下示例的几个实例:
std::string str = "This is my string";
char* ptr = const_cast<char*>(str.c_str());
ptr[5] = 'w';
ptr[6] = 'a';
在这个简化的示例中,使用const_cast
将返回const char*
的std::string::c_str()
赋值给char*
指针。
这似乎按预期工作,并相应地修改了str
。
但是我本地库中std::string::c_str()
的描述如下:
返回指向空终止内容的常量指针。 这是内部数据的句柄。 不要修改,否则可能会发生可怕的事情。
在cppreference 中,描述包括:
返回一个指向空终止字符数组的指针,该数组的数据与存储在字符串中的数据等效。
...
写入通过
c_str()
访问的字符数组是未定义的行为。
在标准的[string.accessors] 中,描述是相似的,并且没有提供关于这个...以空字符结尾的字符数组的信息,其数据等同于存储在字符串中的数据...。
这不是澄清问题,而是让我更加困惑,什么字符数组? 它是如何等效的? 是副本吗? 如果是这样,为什么要修改它,还要修改原始字符串? 这个实现定义了吗?
我想避免更改使用它的所有代码实例的任务,所以我的问题是:
有什么办法可以是正确的,使用ptr
指针修改str
字符串是否合法?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.