You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,因此输出时认为是空串,无内容输出。
  • 要实现预期需求,不能直接对空串用下标赋值,可选择两种合法写法:
    1. 用追加操作扩展字符串长度:
    string s;
    s += 'h';
    s += 'i';
    
    1. 先调用resize分配足够空间再用下标赋值:
    string s;
    s.resize(2);
    s[0] = 'h';
    s[1] = 'i';
    

内容的提问来源于stack exchange,提问作者xomage

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 19:48:02