”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > C++11 的 `string::c_str()` 仍然以 Null 终止吗?

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

发布于2024-11-08
浏览:877

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() 的同义词。
  • 终止空字符必须位于与字符串数据相同的缓冲区,因为 *(p size()) 必须等于 charT()。因此,即使延迟初始化空字符,也不可能观察处于中间状态的缓冲区。
最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3