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
相关产品推荐
相关产品推荐

