字符串类的c_str()方法返回什么

What does c_str() method from string class returns?

本文关键字:方法 返回 什么 str 字符串      更新时间:2023-10-16

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

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

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

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

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

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

因此,可以放心地假设(对于C++来说,这是正常的),在任何版本的C++中,在任何它的实现中,.c_str()都将返回内部缓冲区。

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

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

注意:我的答案只适用于C++11之前的。对于C++11,这是正确的答案。


  1. 它返回一个终止为null的C字符串。std::string本身不是null终止的,因此允许实现(并且可能会)返回新分配的const char数组。如果创建的std::string超出范围或发生了变异,则返回的c_str()字符串将无效。

  2. data()返回数据,但要注意它不是以null结尾的字符串。

在这两种情况下,都不应该调整数据,data()c_str()都返回指向const char的指针,而实际上不应该这样做。

例如,std::string可以是引用计数的字符串(尽管这已经不常见了),甚至可以对其数据使用时髦的索引方案(尽管从未见过)。

您可以通过char *address = &str[0];获取字符串的起始地址。无需将字符串转换为c字符串表示。

如果您确实想要字符串中的"data",那么string::data()就是您要查找的函数。

但是,请注意,与c_str()一样,它是指向数据的const指针——您不应该修改此数据。

在C++11中,指针返回字符串对象当前用于存储符合其值的字符的内部数组。

请参阅http://www.cplusplus.com/reference/string/string/c_str/了解更多详细信息。