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

C语言编程:读取文件每行内容存入数组出现段错误问题求助

问题排查与解决方案

段错误核心原因

  • 栈空间溢出:你在main函数内定义的局部二维数组char arr[80368][60]总大小约为4.8MB,而大部分操作系统默认给进程分配的栈空间只有1~4MB,局部变量存储在栈区,过大的栈内存申请直接触发栈溢出,是段错误的最主要诱因。
  • 数组越界风险:你没有做数组边界校验,如果系统里的/usr/share/dict/words文件行数超过80368,count累加超过数组最大下标后继续写入arr[count]会触发内存越界,也会导致段错误。

修复方案

方案1:调整变量存储区域

把大数组改为静态局部变量或者全局变量,这两类变量不会存储在栈区,而是存储在进程的全局数据段,不受栈空间大小限制:

#include <stdio.h>
#include <string.h>

int main (int argc, char* argv[]) {
    char* file="/usr/share/dict/words";

    FILE *dict;
    char str[60];
    // 加static关键字将数组放到全局数据段,规避栈溢出
    static char arr[80368][60];
    int count = 0;
    dict = fopen(file, "r");
    if(dict == NULL){
            perror("Error opening file");
            return(-1);
    }
    // 增加边界判断,防止数组越界
    while(fgets(str,sizeof(str),dict) != NULL && count < 80368){
            // 可选:去掉fgets读取的末尾换行符,匹配纯单词存储需求
            str[strcspn(str, "\n")] = '\0';
            strcpy(arr[count], str);
            count++;
    }

    fclose(dict);
    
    return 0;
}

方案2:动态申请内存(更灵活)

如果不确定词典文件的大小,推荐用链表或者动态扩容的指针数组存储单词,避免硬编码数组大小的限制。

额外优化点

fgets读取每行内容时会把末尾的换行符\n也存入字符串,如果你需要和示例一致存储纯单词内容,记得主动去掉末尾换行符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 05:15:00