我想访问由字符串类维护的数组的起始地址。
string str="hey";
char* pointer=(char*)str.c_str();
指针是否指向数组的地址(由字符串类维护)?或字符串类将从动态内存创建一个新数组并将现有字符串复制到其中并返回它的地址?
如果这不是正确的方法,那么如何访问由字符串类维护的数组的起始地址?
答案 0 :(得分:28)
在 C ++ 11 标准中明确指出.c_str()
(以及更新的.data()
)将返回指向{{1}使用的内部缓冲区的指针}}
通过std::string
获取指针后对std :: string的任何修改都可能导致返回的.c_str()
变为无效(即 - {{1} }内部必须重新分配空间。)
在以前的C ++标准中,允许实现返回任何内容。但由于标准不要求用户取消分配结果,我从未见过任何实现返回任何新分配的内容。至少GNU gcc和MSVC ++的STL字符串是内部以零结尾的char数组,由char *
返回。
因此可以安全地假设(正常情况下C ++注意)在任何版本的C ++中,任何它的实现std::string
都将返回内部缓冲区。
换句话说 - 你永远不应该保留c_str()
的值,除非你100%确定它将来不会改变它的大小(除非它是.c_str()
,即)
P.S。顺便说一下,你永远不应该做.c_str()
。它是const
并且您不应该修改内容,部分原因是上述 - 您可能最终覆盖其他对象的内存或破坏char* pointer=(char*)str.c_str();
的内部状态,以防万一实现做一些花哨的事情,比如为更快的const char *
索引字符(更新的看到了,但是嘿 - 这是封装!)
答案 1 :(得分:4)
注意:我的回答仅适用于 pre-C++11 。对于C ++ 11,this是正确的答案。
它返回一个带空终止的C字符串。 std::string
本身不是以null结尾的,因此允许(并且可能会)返回新分配的const char
数组。如果创建std::string
超出范围或者发生变异,则c_str()
- 返回的字符串将失效。
data()
返回数据,但要注意它不是以空字符结尾的字符串。
在这两种情况下,您都应该调整这些数据,data()
和c_str()
都会返回指向const char
的指针,而您确实不应该这样做。
例如,std::string
s被允许作为引用计数字符串(虽然这不再常见)或甚至可能对其数据使用时髦的索引方案(但从未见过)。
答案 2 :(得分:1)
您可以通过char *address = &str[0];
获取字符串起始地址。无需将字符串转换为c-string表示。
答案 3 :(得分:1)
如果你真的想要字符串中的“数据”,那么string::data()
就是你要找的功能。
但请注意,与c_str()
类似,它是指向数据的const
指针 - 您不应该修改此数据。
答案 4 :(得分:0)
在C ++ 11中,返回的指针指向字符串对象当前使用的内部数组,以存储符合其值的字符。
有关详细信息,请参阅http://www.cplusplus.com/reference/string/string/c_str/。