C++从txt文件读取二维三角数组及段错误问题排查
问题根源
你的代码存在3处致命的内存错误,直接触发未定义行为,这是release模式无输出、偶发段错误的核心原因:
arr初始分配大小和类型完全不匹配:arr是int**类型,存储的元素是指针,64位系统下单个指针占8字节,但你用malloc(3*sizeof(int))只分配了12字节空间,连2个指针都存不下,且后续行数增加时从未给arr扩容,写入arr[size-1]时从第一行开始就存在堆越界写。- 单行数组分配长度错误:你用
new int[size-1]给当前行分配空间,但当前行实际需要存储size个元素:读取第一行时size=1,你实际分配了0长度的数组,后续循环写入size个元素时完全越界,直接破坏堆内存结构。调试模式下编译器会给堆块额外填充保护字节,越界不会立刻触发崩溃,release模式无额外保护,堆结构被破坏后就会出现无输出、随机崩溃的现象。 - 混合使用
malloc/realloc和new时没有做对应释放,虽然小程序退出时系统会回收内存,但不规范的内存操作会放大越界问题的影响。
修复后可直接运行的代码
#include <iostream> #include <fstream> #include <cstdlib> int main() { std::ifstream input_file("input_file.txt"); if (!input_file.is_open()) { std::cerr << "无法打开输入文件\n"; return 1; } int line_length{1}; int arr_capacity = 4; int **arr = (int**)malloc(arr_capacity * sizeof(int*)); int *line_buffer = (int*)malloc(line_length * sizeof(int)); int temp{}; int curr_index{}; while(input_file >> temp){ line_buffer[curr_index] = temp; curr_index++; if(curr_index == line_length){ if (line_length > arr_capacity) { arr_capacity *= 2; arr = (int**)realloc(arr, arr_capacity * sizeof(int*)); } arr[line_length - 1] = new int[line_length]; for(int i = 0; i < line_length; i++){ arr[line_length - 1][i] = line_buffer[i]; } line_length++; curr_index = 0; line_buffer = (int*)realloc(line_buffer, line_length * sizeof(int)); } } input_file.close(); int total_lines = line_length - 1; for(int a = 0; a < total_lines; a++){ for(int j = 0; j <= a; j++){ std::cout << arr[a][j] << " "; } std::cout << "\n"; delete[] arr[a]; } free(line_buffer); free(arr); return 0; }
代码额外增加了文件打开校验、arr动态扩容逻辑、内存匹配释放逻辑,修正了所有内存长度错误,读取你给出的示例三角数组可正常输出:
1 8 4 2 6 9 8 5 9 6
内容的提问来源于stack exchange,提问作者kingSlayer000
相关产品推荐
相关产品推荐

