LeetCode 443字符串压缩代码出现Heap-Buffer-Overflow运行时错误求助
LeetCode 443 字符串压缩 Heap-Buffer-Overflow 问题修复
问题根源
- 违反题目规则,冗余写入数字:LeetCode 443要求仅当字符出现次数>1时才追加数字,你的代码对出现次数为1的字符也写入数字,导致
pointer无意义累加,后续写入字符时超出数组边界,触发Heap-Buffer-Overflow。 - 未处理最后一组字符:遍历结束后,最后一组连续字符及其次数未写入结果数组,既导致压缩不完整,也可能引发后续越界风险。
- 边界检查无效:你添加的
(pointer + j) < charsSize仅能阻止数字写入越界,但无法避免pointer过度累加后写入字符的越界操作。
修复后的代码
int compress(char* chars, int charsSize) { if (charsSize < 2) return charsSize; int pointer = 0; char curr = chars[0]; int currNum = 1; for (int i = 1; i < charsSize; i++) { if (chars[i] == curr) { currNum++; } else { chars[pointer++] = curr; // 仅次数>1时写入数字 if (currNum > 1) { int tempNum = currNum; int start = pointer; // 从低位到高位写入数字 while (tempNum > 0) { chars[pointer++] = (tempNum % 10) + '0'; tempNum /= 10; } // 反转数字得到正确顺序 int end = pointer - 1; while (start < end) { char temp = chars[start]; chars[start] = chars[end]; chars[end] = temp; start++; end--; } } curr = chars[i]; currNum = 1; } } // 处理循环结束后的最后一组字符 chars[pointer++] = curr; if (currNum > 1) { int tempNum = currNum; int start = pointer; while (tempNum > 0) { chars[pointer++] = (tempNum % 10) + '0'; tempNum /= 10; } int end = pointer - 1; while (start < end) { char temp = chars[start]; chars[start] = chars[end]; chars[end] = temp; start++; end--; } } return pointer; }
关键修复点
- 添加次数判断:仅在
currNum > 1时写入数字,避免pointer不必要的累加,从根源上防止越界。 - 补充最后一组处理:遍历结束后单独处理最后一组字符,确保所有数据都被压缩。
- 优化数字写入逻辑:通过低位写入+反转的方式生成数字字符串,避免原代码中复杂的索引计算,降低出错概率。
内容的提问来源于stack exchange,提问作者0xCESR
相关产品推荐
相关产品推荐

