合并两个有序数组时触发Segmentation Fault问题排查求助
合并有序数组触发Segmentation Fault的问题排查
你的代码存在两个关键问题导致异常:
1. 缺少必要的头文件
代码中使用了printf函数,但未包含<stdio.h>头文件,这会导致未定义行为,可能引发Segmentation Fault或其他运行错误。
2. 合并逻辑的死循环
在merge函数的while循环中,当arr1->A[i]等于arr2->A[j]时,两个if条件都不满足,导致i、j、k均不递增,进入无限死循环。长时间的死循环可能引发内存相关异常,或在部分编译器环境下直接触发Segmentation Fault。
修复后的完整代码
#include <stdio.h> #include <stdlib.h> struct Array { int A[10]; int size; int length; }; struct Array* merge(struct Array *arr1, struct Array *arr2) { int i, j, k; i = j = k = 0; struct Array *arr3 = (struct Array*)malloc(sizeof(struct Array)); while (i < arr1->length && j < arr2->length) { if (arr1->A[i] <= arr2->A[j]) { // 处理小于等于的情况,避免死循环 arr3->A[k] = arr1->A[i]; k++, i++; } else { arr3->A[k] = arr2->A[j]; k++, j++; } } for (; i < arr1->length; i++) { arr3->A[k++] = arr1->A[i]; } for (; j < arr2->length; j++) { arr3->A[k++] = arr2->A[j]; } arr3->size = 10; arr3->length = arr1->length + arr2->length; return arr3; } void Display(struct Array arr) { int i; for (i = 0; i < arr.length; i++) { printf("%d ", arr.A[i]); } } int main() { struct Array arr1 = {{2, 9, 21, 28, 35}, 10, 5}; struct Array arr2 = {{2,3,16,18,28}, 10, 5}; struct Array *arr3; arr3 = merge(&arr1, &arr2); Display(*arr3); // 释放malloc分配的内存,避免内存泄漏 free(arr3); return 0; }
额外说明
修复后的代码中:
- 新增
<stdio.h>头文件,确保printf能正确编译运行。 - 将原有的两个独立
if改为if-else结构,处理了元素相等的情况,彻底避免死循环。 - 添加
free(arr3)释放动态分配的内存,养成良好的内存管理习惯。
内容的提问来源于stack exchange,提问作者jroh
相关产品推荐
相关产品推荐

