向动态数组插入整数时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 []释放它!这会导致内存泄漏,程序运行时间越长,占用的内存越多,最终可能引发其他问题。
我把修正后的关键代码段给你列出来:
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

