C++中访问超出string长度的下标为何允许且不抛出错误?
C++ std::string 越界访问无报错原理说明
1. 核心本质:未定义行为
C++标准明确规定,std::string的operator[]不提供边界校验,当下标超出字符串实际长度时,行为属于未定义行为:
- 标准没有强制要求该场景必须抛出异常或者触发崩溃
- 不同编译器、不同运行环境、不同编译参数下的表现完全没有一致性,输出空字符、程序崩溃、输出乱码都属于合规的表现,不能依赖某次运行的结果判断代码正确性
2. 本次输出空字符的具体原因
你当前的运行环境大概率使用了带小字符串优化(SSO)的标准库实现:
- 长度较短的字符串会直接存储在栈上的预分配缓冲区中,缓冲区通常默认16字节左右,实际存储内容后剩余的空间默认初始化为0
- 示例字符串
"12345"长度仅5,下标10刚好落在了SSO缓冲区的未使用区域,读到的值为'\0',cout输出'\0'时视觉上就表现为空字符
3. 正确的边界安全访问方式
如果你需要程序在越界时主动抛出异常,应该使用std::string的at()方法而非[]运算符:
cout << g.at(10) << endl; // 越界时会抛出std::out_of_range异常
内容的提问来源于stack exchange,提问作者Gagan Ganapathy
相关产品推荐
相关产品推荐

