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

C++中string类型在特定测试用例下触发运行时错误的原因咨询

C++ string类型引发运行时错误的原因分析

问题场景

原代码针对Codeforces题目编写,使用string a,b,c;时在第7个长测试用例出现运行时错误,将其改为char a[100],b[100],c[100];后程序正常通过。

错误核心代码片段:

string a,b,c;
int j=0,k=0,l=0;
for(i=0;s[i]!='\0';i++)
{
    if(s[i]=='1')
    {
        a[j]='1';  // 直接访问空string的越界位置
        a[j+1]='+';
        j+=2;
    }
    // 处理'2'、'3'的逻辑同理
}

触发错误的测试用例:

2+3+3+1+2+2+2+1+1+2+1+3+2+2+3+3+2+2+3+3+3+1+1+1+3+3+3+2+1+3+2+3+2+1+1+3+3+3+1+2+2+1+2+2+1+2+1+3+1+1

原因解析

  • std::string的下标访问特性:默认初始化的string是空字符串,长度为0。string的operator[]不会自动扩容,当访问的索引超过当前string的长度时,属于未定义行为——短测试用例可能因内存布局侥幸不崩溃,但长测试用例多次越界访问会直接破坏内存空间,触发运行时错误。
  • char数组的内存分配:char a[100]是固定大小的栈内存数组,初始化后直接拥有100字节的可用空间,只要访问下标不超过99(数组大小-1),就不会出现越界问题,刚好适配题目输入长度限制。

正确使用string的写法

如果要继续使用string,应该用内存安全的方法添加字符,比如:

if(s[i]=='1')
{
    a += "1+";  // 自动扩容,安全添加字符
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 08:45:18