我已阅读了关于
我喜欢这个说明的清晰度:
返回一个指针,该指针指向一个数组,该数组包含表示字符串对象的当前值的以 null 结尾的字符序列(即 C 字符串)。该数组包括与组成字符串对象值相同的字符序列以及额外的一个终止空字符 ('\0')。
然而,有关此函数目的的某些事情仍不清楚。
你可能会认为调用c_str会向存储在主机对象 (
我没有看到任何代码会在字符数组末尾添加
或者我漏掉了什么?
std::string::c_str
的各种描述,包括多年/几十年来在SO上提出的问题。我喜欢这个说明的清晰度:
返回一个指针,该指针指向一个数组,该数组包含表示字符串对象的当前值的以 null 结尾的字符序列(即 C 字符串)。该数组包括与组成字符串对象值相同的字符序列以及额外的一个终止空字符 ('\0')。
然而,有关此函数目的的某些事情仍不清楚。
你可能会认为调用c_str会向存储在主机对象 (
std::string
) 的内部 char 数组中添加一个\0
字符。s[s.size+1] = '\0'
但是似乎默认情况下,std::string
对象在调用c_str
之前就已经以空字符结尾:
查看定义后:
const _Elem *c_str() const _NOEXCEPT
{ // return pointer to null-terminated nonmutable array
return (this->_Myptr());
}
我没有看到任何代码会在字符数组末尾添加
\0
。据我所知,c_str
只是返回指向存储在数组第一个元素中的字符的指针,就像begin()
一样。我甚至没有看到检查内部数组是否以\0
结尾的代码。或者我漏掉了什么?
c_str()
每次被调用时并没有在数组末尾追加 0,因为这将需要分配一个新的数组,并且调用者(也就是你)每次都需要释放它。 - barak manosc_str
被标记为const
,这意味着根据当前标准中的语言,它应该是相对无数据竞争的。如果你在一个const
方法中修改字符串,你需要加锁,因为你需要验证值是否已经改变。标准要求c_str
也是 O(1),这实质上意味着内部表示必须是零终止的。 - Mgetz