C 11 的 string::c_str() 函数不再以 Null 结尾吗?
在 C 中, basic_string 类提供了各种方法访问其字符。其中一个方法 c_str() 自 C 11 以来一直是混乱的根源。在 C 11 之前,c_str() 负责返回表示字符串内容的以 null 结尾的字符数组。
但是,在 C 11 中,basic_string::c_str() 的定义已更改。它现在被定义为与 basic_string::data 相同,后者又返回一个指向字符串内部字符缓冲区开头的指针。这提出了一个问题:此更改是否意味着 c_str() 不再保证以 null 结尾的字符串?
答案:字符串内部需要以 null 结尾的缓冲区
这个问题的答案是否定的。尽管 C 11 中发生了变化,字符串仍然需要在内部使用空终止缓冲区。这从 C 标准中的operator[]方法(21.4.5)的定义中可以明显看出:
Requires: pos <= size(). Returns: *(begin()+pos) if pos < size(), otherwise a reference to an object of type T with value charT(); the referenced value shall not be modified.
c_str() 是根据operator[]定义的:
Returns: A pointer p such that p + i == &operator[](i) for each i in [0,size()].
由于 c_str() 和 data 都需要 O(1) 操作,因此实际上强制实现使用以 null 结尾的缓冲区。此外,operator[] 的返回值要求可确保 c_str() 返回指向以 null 结尾的缓冲区的指针。因此,尽管 C 11 中发生了变化,c_str() 仍然提供以 null 结尾的字符串。
以上是C 11 的 `string::c_str()` 仍然保证以 Null 结尾的字符串吗?的详细内容。更多信息请关注PHP中文网其他相关文章!