c++ - 字符串类的 c_str() 方法返回什么?

标签 c++

我想访问由字符串类维护的数组的起始地址。

string str="hey";
char* pointer=(char*)str.c_str();
  1. 指针是否指向数组的地址(由字符串类维护)?还是字符串类将从动态内存中创建一个新数组并将现有字符串复制到其中并返回它的地址?

  2. 如果这不是正确的方法,那么如何访问字符串类维护的数组的起始地址呢?

最佳答案

C++11 标准中明确规定 .c_str()(以及更新的 .data())应返回指向 std::string 使用的内部缓冲区的指针。

在通过 .c_str() 获得指针后对 std::string 的任何修改 可能 导致所述 char * 返回成为无效(即 - 如果 std::string 在内部必须重新分配空间)。

在以前的 C++ 标准中,允许返回任何东西。但作为标准不要求用户解除分配结果,我从未见过任何实现返回任何新分配的内容。至少 GNU gcc 和 MSVC++ 的 STL 字符串是内部以零结尾的字符数组,由 c_str() 返回。

因此可以安全地假设(通常对 C++ 谨慎)在任何 C++ 版本中的任何实现 .c_str() 都将返回内部缓冲区。

换句话说 - 你永远不应该保留 .c_str() 的值,除非你 100% 确定它不会在未来的任何时候改变它的大小(除非它是一个 const,即)。

附:顺便说一句,你永远不应该这样做 char* pointer=(char*)str.c_str();。它是 const char * 并且你不能修改内容,部分原因是上面的 - 你最终可能会覆盖一些其他对象的内存 破坏 的内部状态std::string,以防实现做一些花哨的事情,比如为更快的 .find() 索引字符(较新看到,但是嘿 - 这是一个封装!)

关于c++ - 字符串类的 c_str() 方法返回什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17402980/

相关文章:

c++ - CMake:使静态库有效但动态库无效

c++ - 根据编号找出距离的工具。 unix中的跳数

c++ - 访问传递引用对象中传递引用对象的变量

c++ - 使用 CUDA 计算(非常)大的矩阵乘积

c++ - Infix To Postfix 的输出中没有运算符和括号

c++ - 处理来自Unrar DLL的错误

C++ shared_ptr std::bind 和 std::function

c++ - 从文本文件中读取矩阵并显示

c++ - D3D10 常量缓冲区不工作

c++ - 运算符重载(尤其是 'new' )是如何工作的?