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

合并两个有序数组时触发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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 14:50:33