字符串类的c_str()方法返回什么
What does c_str() method from string class returns?
我想访问由字符串类维护的数组的起始地址。
string str="hey";
char* pointer=(char*)str.c_str();
指针是否指向数组的地址(由字符串类维护)?或者字符串类将从动态内存创建一个新数组,并将现有字符串复制到其中并返回其地址?
如果这不是正确的方法,那么如何访问字符串类维护的数组的起始地址?
在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,这是正确的答案。
-
它返回一个终止为null的C字符串。
std::string
本身不是null终止的,因此允许实现(并且可能会)返回新分配的const char
数组。如果创建的std::string
超出范围或发生了变异,则返回的c_str()
字符串将无效。 -
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/了解更多详细信息。
- 从父类方法返回子类对象
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 让bool方法返回其他整数
- 不能将方法返回的值用于另一个方法
- 从私有成员变量的成员方法返回unique_ptr
- 我的模板类方法返回错误类型?
- QtQuick - qml:28:错误:未知方法返回类型:自定义类型
- 我无法使用C++指针指向类方法返回的 std::vector
- 对象引用中的字段以不同的方法返回不同的值
- 类方法返回指向具有模板的类成员的指针
- 如何将字符串从 C++/CLI 方法返回到调用它的非托管C++
- 从工厂方法返回的ComPtr的引用计数增加两次
- 如何使用 SFINAE 从 end() 方法返回 (const_) 迭代器
- Arduino trim() 和 replace() 方法返回从 'void' 到非标量类型'String'请求的转换
- 从类方法返回 "const char*" 作为 std::string&
- 如何使用 "get" 方法返回类的私有 std::unique_ptr 成员
- 可能从单个方法返回不同类型的对象
- qml 未知方法返回类型:ArchiveFile*,即使调用了 qmlRegisterUncreatableType
- 如何从方法返回静态常量 int std::array?
- 当从其他方法返回 vector 时,C++无法访问矢量元素