首页  >  文章  >  后端开发  >  C 11 的 `string::c_str()` 仍然以 Null 终止吗?

C 11 的 `string::c_str()` 仍然以 Null 终止吗?

Susan Sarandon
Susan Sarandon原创
2024-10-27 00:52:02236浏览

Is C  11's `string::c_str()` Still Null-Terminated?

C 11 的 string::c_str() 是否消除空终止?

在 C 11 中,string::c_str 不再保证产生一个以 null 结尾的字符串。

原因:

在 C 11 中, string::c_str 被定义为与 string::data 相同,而 string::data 又被定义相当于 *(begin() n) 对于 0

后果:

这意味着 string::c_str() 可能不再返回以 null 结尾的字符串,在假定此类终止的情况下会导致潜在错误。

解决方案:

解决方案仅将 string::c_str() 用于与遗留代码的兼容性。对于新代码,请改用 string::data()。虽然 string::data() 不返回以 null 结尾的字符串,但它返回一个指向底层缓冲区的指针,该缓冲区保证在内部以 null 结尾。

实现细节:

在内部,字符串现在需要使用以 null 结尾的缓冲区。第 21.4.5 节中的 operator[] 定义要求,对于 size()

附加说明:

  • &operator[](0) 可以用作 c_str() 的同义词。
  • 终止空字符必须位于同一个字符中buffer 作为字符串数据,因为 *(p size()) 必须等于 charT()。因此,即使延迟初始化空字符,也不可能在中间状态下观察缓冲区。

以上是C 11 的 `string::c_str()` 仍然以 Null 终止吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn