如何解决为什么 string::c_str() 在动态分配字符串时返回 const char* ?
为什么它返回一个常量字符指针? C++11 标准说:
返回的指针指向字符串对象当前使用的内部数组,用于存储符合其值的字符。
动态分配的东西怎么可能是常量(const char*
)?
解决方法
在 C 和 C++ 中,const
或多或少地转化为“只读”。
因此,当某些东西返回 char const *
时,并不一定意味着它指向的数据实际上是 const
——它只是意味着您收到的指针仅支持读取,不支持写入,它指向的数据。
字符串对象本身可能能够修改该数据——但是(至少通过您收到的指针)您不能直接修改数据。
,c_str
返回的指针被声明为指向 const char
以防止通过该指针修改内部 string
缓冲区。
string
缓冲区确实是动态分配的,c_str
返回的指针只有在字符串本身没有变化时才有效。引自cppreference.com:
从 c_str()
获得的指针可能因以下原因失效:
-
将字符串的非常量引用传递给任何标准库函数,或
在字符串上调用非常量成员函数,不包括operator[]、at()、front()、back()、begin()、rbegin()、end()和rend()。
我将这个问题解释为你为什么不能将它转换回 char *
并写信给它并期望它起作用。
标准库为自己保留了在复制构造函数中懒惰复制字符串的选项;因此,如果您通过 c_str()
的结果写入它,您可能会写入其他字符串。由于 c_str()
的大多数用途不需要写入字符串,因此对 c_str()
调用进行去重会造成过大的惩罚。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。