为何运行程序时出现Segmentation fault: 11错误?
为什么读取分数文件时会出现Segmentation fault: 11错误?
Hey there! Segmentation fault: 11(也就是咱们常说的段错误)本质是程序试图访问不属于它的内存区域,结合你说的这个读取DATA分数文件的场景,我整理了几个最可能的触发原因,你可以对照自己的代码排查:
1. 数组越界访问
你提到DATA里有16个分数:10 25 50 50 5 0 0 45 45 15 25 50 2 50 30 40。如果你的代码里预先定义了一个固定大小的数组,但数组长度小于16,循环写入分数时就会越界,覆盖其他内存区域,直接触发段错误。
比如你写了这样的代码:
int scores[10]; // 只能存10个分数,但你要读16个 FILE *fp = fopen("DATA", "r"); for (int i = 0; i < 16; i++) { fscanf(fp, "%d", &scores[i]); // 当i>=10时,就会访问数组外的内存 }
2. 文件指针未正确初始化
如果DATA文件不存在、路径写错了,或者程序没有读取该文件的权限,fopen会返回NULL(空指针)。要是你没检查这个返回值就直接用指针去读数据,就会触发段错误。
错误示例:
FILE *fp = fopen("DATA", "r"); // 没检查fp是否为NULL就直接操作 int score; fscanf(fp, "%d", &score); // 访问空指针指向的内存,直接崩溃
3. 使用未初始化的野指针
如果你声明了一个指针但没给它分配内存(比如没调用malloc),就直接往里面存分数,这个指针会指向随机的内存地址,写入时就会触发段错误。
比如:
int *scores; // 未初始化的野指针 FILE *fp = fopen("DATA", "r"); for (int i = 0; i < 16; i++) { fscanf(fp, "%d", &scores[i]); // 往随机内存地址写数据 }
4. 循环条件错误导致的无限/越界循环
要是你没正确判断文件读取的结束条件,循环会一直执行,不断往数组里写数据直到越界。比如误用while (!feof(fp))但没处理读取失败的情况,或者循环计数器没有正确终止,都会导致内存越界。
快速排查建议
- 先给文件打开加个判断,确保文件能正常打开:
FILE *fp = fopen("DATA", "r"); if (fp == NULL) { perror("Failed to open DATA file"); return 1; } - 确认你的数组大小或者动态分配的内存足够容纳16个分数;
- 用调试工具定位问题:编译时加
-g参数,然后用gdb运行程序,触发错误后输入bt查看调用栈,就能精准定位到出错的代码行。
内容的提问来源于stack exchange,提问作者Taylor Hood
相关产品推荐
相关产品推荐

