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

C语言将文本文件转为数组时出现segmentation fault错误如何解决

问题排查与修复方案

常见触发段错误的原因(匹配你的使用场景)

  • 未做文件打开校验:如果指定路径的体重文件不存在、读取权限不足,fopen会返回NULL,后续直接用空指针执行读文件操作会直接触发段错误
  • 数组越界:预分配的固定长度数组小于文件内的体重数据条数,写入数据时超出数组边界篡改了非法内存;或是读文件的循环条件写错,导致无限往数组内写入数据
  • 空指针操作:存储体重的数组指针未分配内存就直接写入,或是接收读取值的变量未初始化就传入fscanf
  • 读取格式不匹配:文件内容和读取用的格式符不一致,比如文件内有非数字字符,用%f/%d读取失败后写入非法地址

排查与修复步骤

  1. 给fopen增加返回值判断,示例逻辑:
FILE *fp = fopen("elephant_seal_weight.txt", "r");
if (fp == NULL) {
    perror("文件打开失败");
    return 1;
}
  1. 避免用固定长度数组存数据,优先先统计文件内有效数据条数再申请对应大小的内存:
    • 先遍历一次文件统计有效体重数据的条数n
    • 用malloc(n * sizeof(double))申请刚好大小的动态数组
  2. 给fscanf增加返回值判断,确保每次成功读取到数值后再写入数组:
int count = 0;
double weight;
// 假设已统计数据总条数为total,申请了double *weights = malloc(total * sizeof(double));
while (fscanf(fp, "%lf", &weight) == 1 && count < total) {
    weights[count++] = weight;
}
  1. 计算平均值前判断有效数据条数是否大于0,避免触发除0错误
  2. 运行完后记得释放申请的堆内存、关闭打开的文件指针

可直接运行的参考代码

#include <stdio.h>
#include <stdlib.h>

int main() {
    // 打开体重文件
    FILE *fp = fopen("seal_weights.txt", "r");
    if (fp == NULL) {
        perror("无法打开体重文件");
        return EXIT_FAILURE;
    }

    // 第一次遍历统计有效数据条数
    int total = 0;
    double temp;
    while (fscanf(fp, "%lf", &temp) == 1) {
        total++;
    }
    if (total == 0) {
        printf("文件中无有效体重数据\n");
        fclose(fp);
        return EXIT_FAILURE;
    }

    // 将文件指针回退到文件开头
    rewind(fp);

    // 申请对应大小的动态数组
    double *weights = (double *)malloc(total * sizeof(double));
    if (weights == NULL) {
        perror("内存申请失败");
        fclose(fp);
        return EXIT_FAILURE;
    }

    // 读取数据到数组同时求和
    double sum = 0.0;
    for (int i = 0; i < total; i++) {
        fscanf(fp, "%lf", &weights[i]);
        sum += weights[i];
    }

    // 计算并输出平均体重
    double avg = sum / total;
    printf("象海豹平均体重为:%.2lf\n", avg);

    // 释放资源
    free(weights);
    fclose(fp);
    return EXIT_SUCCESS;
}

编译运行命令:
gcc -o seal_avg seal_avg.c -g -Wall
加-g参数会生成调试信息,后续如果再遇到崩溃,可以用gdb ./seal_avg运行程序,崩溃后输入bt即可查看调用栈,直接定位出错的代码行。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 00:06:06