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

使用malloc在函数内定义数组并返回时出现Segmentation fault问题排查

段错误原因及修复方案

核心错误原因

  • main函数中声明的int *len;是未初始化的野指针,指向内存中的随机地址。当takeInput函数执行fscanf(fp, "%d", len);时,会尝试往这个随机地址写入数据,直接触发非法内存访问,导致段错误。

修复步骤

1. 修正main函数的指针使用

把main里的指针声明改为普通int变量,传递它的地址给takeInput函数:

int main() {
    int len; // 改为普通int变量,而非指针
    int *arr = takeInput(&len); // 传递len的地址

    printf("%d\n", len); // 直接使用len,无需解引用指针

    free(arr); // 释放malloc分配的内存,避免内存泄漏
    return 0;
}

2. 补充必要的错误检查(可选但推荐)

为提升程序健壮性,需检查文件打开、内存分配及数据读取是否成功:

int *takeInput(int *len) {
    FILE *fp = fopen("process.txt", "r");
    if (fp == NULL) { // 检查文件是否成功打开
        perror("Failed to open file");
        exit(EXIT_FAILURE);
    }

    if (fscanf(fp, "%d", len) != 1) { // 检查长度读取是否成功
        perror("Failed to read length");
        fclose(fp);
        exit(EXIT_FAILURE);
    }

    int *arr = malloc(sizeof(int) * (*len));
    if (arr == NULL) { // 检查内存分配是否成功
        perror("Failed to allocate memory");
        fclose(fp);
        exit(EXIT_FAILURE);
    }

    for (int i = 0; i < (*len); i++) {
        if (fscanf(fp, "%d", &arr[i]) != 1) { // 检查数组元素读取是否成功
            perror("Failed to read array element");
            free(arr);
            fclose(fp);
            exit(EXIT_FAILURE);
        }
    }

    fclose(fp);
    return arr;
}

修复后说明

修改后,len是有效的int变量,传递地址给takeInput后,函数可安全写入读取到的长度值。补充错误检查能及时捕获文件读取、内存分配失败的情况,避免程序崩溃或产生异常行为。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 14:45:15