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

C++给字符串前置行号时出现stack smashing detected错误如何解决

错误原因
  • 核心触发原因是未初始化std::string空间就直接通过下标写入内容:代码中arr是初始长度为0的空字符串,[]运算符不会自动扩容,直接给arr[j]赋值属于越界内存写入,破坏了栈/堆的内存结构,因此触发stack smashing detected报错。
  • 次要逻辑错误:直接将int类型的行号count赋值给char类型的字符串元素,只会存储对应ASCII码的字符,无法输出预期的数字行号;行号偏移计算逻辑混乱,进一步加剧内存越界概率。
  • 规范问题:遍历std::string用code[i] != '\0'虽然在新标准下可用,但不如通过长度判断或迭代器遍历稳妥,极端场景下也可能出现越界。
修复方案

修改核心逻辑为使用std::string的自带扩容方法拼接内容,将行号转为字符串后再插入,参考实现代码如下:

#include <string>
using namespace std;

string prepend(string code) {
    string arr;
    // 与原代码逻辑一致,行号从100开始计数
    int line_count = 100;
    // 标记是否需要在行首插入行号
    bool is_line_start = true;
    for (char cur_char : code) {
        if (is_line_start) {
            // 行首插入行号+空格,to_string自动处理多位数行号
            arr += to_string(line_count);
            arr += " ";
            line_count++;
            is_line_start = false;
        }
        // 写入当前字符
        arr += cur_char;
        // 遇到换行符标记下一行需要插入行号
        if (cur_char == '\n') {
            is_line_start = true;
        }
    }
    return arr;
}

修复点说明:

  • 移除了所有直接对空string进行下标写入的操作,使用+=运算符自动完成字符串扩容,彻底避免内存越界
  • 用std::to_string将整型行号转为数字字符串,符合输出预期,支持任意位数的行号
  • 采用行首标记位判断插入行号的时机,逻辑清晰无偏移计算错误
  • 改用范围for遍历输入字符串,避免输入字符串访问越界

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 12:36:01