C++ string按单个元素赋值后输出s为空但s[0]有值原因咨询
你提供的代码如下:
#include <iostream> #include <string> using namespace std; int main(){ string s; s[0] = 'h'; s[1] = 'i'; string s2; s2="hello"; cout <<s[0]<<"*"<< s << "*" << s2<<"*"; return 0; }
该现象是代码触发C++未定义行为导致的,具体原因如下:
- 默认构造的
std::string对象初始size()为0,可合法访问的下标范围为空,C++标准明确规定std::string的operator[]不做边界检查,当下标大于等于size()时访问属于未定义行为。你直接对s[0]、s[1]赋值本质是越界改写了字符串管理范围外的内存,当前运行环境下这块内存刚好可读写,所以能读出s[0]的'h'值,但该表现完全不可靠,换环境可能直接崩溃、输出乱码。 - 输出整个
s为空的原因是:std::string输出全串时会读取内部存储的长度字段决定输出字符数,你直接越界改写内存的操作不会修改s的内部长度值,它的长度始终为0,因此输出时认为是空串,无内容输出。 - 要实现预期需求,不能直接对空串用下标赋值,可选择两种合法写法:
- 用追加操作扩展字符串长度:
string s; s += 'h'; s += 'i';- 先调用
resize分配足够空间再用下标赋值:
string s; s.resize(2); s[0] = 'h'; s[1] = 'i';
内容的提问来源于stack exchange,提问作者xomage
相关产品推荐
相关产品推荐

