【问题标题】:Why does string::c_str() return a const char* when strings are allocated dynamically?为什么 string::c_str() 在动态分配字符串时返回 const char*?
【发布时间】:2021-04-02 10:15:50
【问题描述】:

为什么它返回一个constant char指针? C++11 标准说:

返回的指针指向字符串对象当前用来存储符合其值的字符的内部数组。

动态分配的东西如何保持不变(const char*)?

【问题讨论】:

  • 内部缓冲区的API是通过const char*接口。提供该成员函数是为了方便地与需要将非可变字符数组作为 C 样式字符串访问的 C API 进行互操作。
  • 您是在问“const 指针如何指向非 const 事物”?或者“当可以使用非常量指针时,为什么要提供 const 指针”?
  • 第一个,我误以为const T* 必须指向一个常量

标签: c++ string char constants


【解决方案1】:

我将把这个问题解释为你为什么不能将其转换回 char * 并写信给它并期望它能够工作。

标准库为自己保留在复制构造函数中延迟复制字符串的选项;因此,如果您通过c_str() 的结果写入它,您可能会写入其他字符串。由于c_str() 的大多数使用不需要写入字符串,因此对c_str() 的调用进行重复数据删除会造成太大的损失。

【讨论】:

    【解决方案2】:

    c_str 返回的指针被声明为指向const char,以防止通过该指针修改内部string 缓冲区。

    string缓冲区确实是动态分配的,c_str返回的指针只有在字符串本身没有变化的情况下才有效。引用cppreference.com:

    从c_str()获得的指针可能会被以下行为无效化:

    • 将对字符串的非常量引用传递给任何标准库函数,或者

    • 在字符串上调用非常量成员函数,不包括operator[]、at()、front()、back()、begin()、rbegin()、end()和rend()。

    【讨论】:

    • 附录:我从没在野外见过它,但是c_str,引用 cppreference,返回一个指向带有数据的以空字符结尾的字符数组的指针等效 存储在字符串中的那些。 重点是我的,因为那个等价物很重要。 c_str返回的指针指向的存储不一定要和string的内部存储一样,如果不一样,修改有什么意义呢? Crom 只知道你刚刚修改了什么。
    • @user4581301 这是我没有注意的有趣措辞,老实说不知道它试图传达什么更深层次的含义。 standard 非常清楚,c_str“返回一个指针 p,使得每个 i in [0, size()] 的 p + i == addressof(operator[](i))”。
    • 这个措辞可以追溯到at least as far as C++11。我知道在过去,幕后可能会发生各种奇怪的事情,但除非我们都错误地阅读了标准,否则这句话在我能想到的所有奇怪的情况下都可以提供一个替代的缓冲,至少对于现代 C++ 而言。为了那些仍在构建 c++98 或 03 的人,可能仍然存在等价物。
    【解决方案3】:

    在 C 和 C++ 中,const 或多或少地转换为“只读”。

    所以,当某些东西返回char const * 时,这并不一定意味着它所指向的数据实际上是const——它只是意味着你接收到的指针只支持读取而不是写入数据它指向。

    字符串对象本身可能能够修改该数据——但是(至少通过您收到的指针)您不能直接修改数据。

    【讨论】:

      猜你喜欢
      • 2013-11-14
      • 2021-07-10
      • 1970-01-01
      • 1970-01-01
      • 2020-07-08
      • 1970-01-01
      • 1970-01-01
      • 2020-08-27
      • 1970-01-01
      相关资源
      最近更新 更多