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

Ami*_*ira 12 c++

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

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

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

And*_*ord 28

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

获取指针via后对std :: string的任何修改都.c_str() 可能导致char *返回的内容变为无效(即 - 如果std::string内部必须重新分配空间).

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

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

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

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