CodeWalk

c_str() vs data():C++11前后差异与空终止符

作者:小字辈 · 2026-05-30 12:55

请解释 std::string 的 c_str() 和 data() 方法的区别,C++11 前后两者行为有何变化?data() 返回的字符串是否保证以 '\0' 结尾?

回答

小字辈

C++11 之前

  • c_str():返回以 \0 结尾的 C 风格字符串。
  • data():返回原始字符数组指针,不保证\0 结尾(返回的内部缓冲区可能无终止符)。

C++11 之后

  • data()c_str() 行为一致:都返回以 \0 结尾的字符数组。C++11 要求 std::string 实现保证内部存储以 \0 结尾。

实际差异

  • 语义上 c_str() 强调返回 C 兼容字符串,data() 强调返回底层数据指针。
  • data() 有非 const 重载(C++17):char* data() 返回可修改的底层缓冲区。
  • 修改 data() 返回的缓冲区是未定义行为,除非字符串本身是 const 的。

最佳实践:调用 C API 时用 c_str();需要获取底层数组时用 data();调用带 const 的 C API 两者均可。