C++11 的 std::string 的基础表示形式是否保证具有终止空字符?
Is C++11's std::string's underlying representation guaranteed to have the terminating null character in place?
先从标准中摘录一些内容:
string::operator[]()
规格:
const_reference operator[](size_type) const;
引用操作符[](size_type pos);
require : pos <= size().
: *(开始()+ pos)如果pos & lt;Size(),否则是对对象的引用类型为T,值为charT()的对象;参考值不得为修改。
复杂度: constant time.
string::c_str()
和string::data()
规格:
const charT* c_str() const noexcept;const data() const noexcept;
返回:一个指针p,使得p + i == &operator[](i)
对应每个i in[0,大小()]。
复杂度: constant time.
结合这两个规范,我们可以看到,c_str()
/data()
返回的指针p
必须满足p[0...size()-1]
表示字符串的元素,p[size()]
等于operator[](size())
,它表示一个值为charT()
的对象。由于指针上的加法运算符用于获取字符串元素和最后一个charT()
对象的地址,因此它们必须位于单个数组中(您不能只拥有字符串元素并动态创建charT()
对象并返回它)。那么,可以肯定地说,在c++ 11中,str::string
保证在其底层存储中具有终止null字符吗?
EDIT:对不起,我没有注意到我的问题是重复的。然而,我在这里得到的答案似乎与那个重复问题的答案相冲突。
同样,我应该像这样削弱我的假设:std::string
的底层表示应该保留足够的空间来容纳终止null字符,并在c_str()
/data()
被调用之前自由设置charT()
的值。(即底层存储必须能够在任何时候至少容纳size()+1
个元素)
不,不是。std::string
可以延迟计算c_str()
和data()
所需的结果。在调用这些方法之前,不能保证底层存储中存在空终止符。
标准只保证字符串字符的连续性。
那么可以肯定地说,在c++ 11中,
std::string
保证在其底层存储中具有终止null字符吗?
我不明白你怎么能从这两句话中得出这个结论。特别是,我在这些引号中没有看到任何需要底层实现维护终止空字符的内容,直到调用c_str()
或data()
。
不…可以肯定地说:那个operator[](size()) == CharT()
和那个c_str()[size()] == 0
和那个data()[size()] == 0
。
是否"底层存储"有一个0在那里是实现定义的,也应该对你的程序没有影响,因为没有办法访问它,除了通过operator[]
和c_str()
,这是在size()
定义的。
- 缺少终止 ' 字符
- 警告:缺少终止"字符
- 如何告诉字符串流忽略null终止字符
- 当 NUL 字符被定义为字符串的一部分时,为什么 strlen() 不计算终止 NUL 字符的字节?
- 如何用字符终止整数输入循环?
- 如何使用 WIN RPC 发送终止的字符数组(用于将图像从客户端上传到服务器)
- 终止具有特定字符的循环
- 为什么具有单独字符的字符数组不像字符串文字那样以 null 终止符结尾?
- 如何调整标准::字符串的大小以删除所有空终止符字符?
- 如何将没有终止字符和大小的返回消息一起使用提升async_read?
- 当想要以类似的字符终止时,获得无限循环在C 中
- C++ 带有终止字符的开关大小写计算器
- 如何用零终止字符纪机char阵列
- C 字符串空终止字符 0 修改
- 基于多个终止字符从UART收集数据
- 将字符串转换为c风格字符串并检测空终止字符
- Delphi-NULL终止字符
- 将std::string分配给非终止字符数组时的预期行为
- 关于零终止字符的困惑
- 在构建c++字符串时如何处理未终止字符数组