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

向动态数组插入整数时Segmentation fault问题的排查与解决

问题根源与修复方案

哇,我一眼就揪出了导致Segmentation fault的核心问题,还有几个小细节也得修正——咱们一步步来:

1. 致命错误:未初始化的索引变量

你在function2里声明了int new_array_pos;,但从来没给它赋初始值!这时候这个变量的值是内存里的随机垃圾数据,当你执行new_array[new_array_pos++]时,这个随机的索引大概率会超出new_array的边界(数组长度是array_length_frm_function1),直接访问了不属于你的内存区域,这就是Segmentation fault的罪魁祸首。

2. 次要但关键的拼写错误

你把subtracted_string拼写成了substracted_string(少了一个t),在stoi(substracted_string)这一行。这个错误会导致编译器找不到正确的变量,要么直接编译报错,要么触发未定义行为,雪上加霜。

3. 隐藏的内存泄漏问题

你在function2里用new int[array_length_frm_function1]分配了动态数组new_array,但没有用delete []释放它!这会导致内存泄漏,程序运行时间越长,占用的内存越多,最终可能引发其他问题。


不使用vector的修复代码

我把修正后的关键代码段给你列出来:

void function2(string *array_frm_function1, int &array_length_frm_function1) { 
    int * new_array = new int[array_length_frm_function1]; 
    int new_array_pos = 0; // 必须初始化索引为0!
    for(int i = 0; i < array_length_frm_function1; i++) { 
        string subtracted_string = array_frm_function1[i].substr(1,1); 
        int string_to_integer = stoi(subtracted_string); // 修正拼写错误
        // 可选:加边界检查,防止意外越界
        if (new_array_pos < array_length_frm_function1) {
            new_array[new_array_pos++] = string_to_integer; 
        } else {
            // 这里可以加错误处理,比如打印日志
            cout << "数组越界警告!" << endl;
            break;
        }
    } 
    delete [] new_array; // 释放动态分配的内存,避免泄漏
}

关于你疑惑的内存地址问题

你提到array_frm_function1、subtracted_string、string_to_integer的内存地址各不相同,这是完全正常的——它们是不同的变量,分别存储在栈或堆的不同位置,和Segmentation fault没有任何关系。段错误的本质是你访问了非法的内存地址(因为未初始化的索引),而不是这些变量的地址是否重复。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 14:08:10