C++递归删除字符串相邻重复字符代码for循环运行报错问题
问题本质
你遇到的运行时错误核心是C++无符号整数下溢导致的数组越界访问,具体逻辑如下:
- C++中
std::string的size()方法返回值为size_t类型,属于无符号整数,运算结果永远不会为负,若减法运算出现负数结果,会发生下溢转为对应位数的最大无符号正整数。 - 当输入字符串长度为1时,
s.size()的返回值为1:- 原for循环判定条件为
j <= s.size() - 2,此时s.size() - 2 = 1 - 2 = -1,无符号运算下会转为极大的正数值(32位环境下为4294967295)。 - 循环变量j初始值为0,
0 <= 极大正整数判定结果为真,for循环会错误进入执行。 - 循环体内访问
s[j+1]即s[1],但长度为1的字符串合法下标只有0,越界访问非法内存直接触发运行时错误。
- 原for循环判定条件为
- 替换为
j < s.size() - 1后,当字符串长度为1时,s.size() -1 = 0,0 < 0判定结果为假,for循环不会执行,自然不会出现越界问题。
优化建议
为了彻底规避无符号数下溢风险,可以将循环条件修改为j + 1 < s.size(),不需要做无符号数的减法运算,逻辑可读性和兼容性都更高。
内容的提问来源于stack exchange,提问作者va_0511
相关产品推荐
相关产品推荐

