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
相关产品推荐
相关产品推荐

