C语言用char*搭配fscanf读TXT触发Segmentation fault: 11段错误
问题核心成因
- 触发
Segmentation fault: 11的最直接原因是代码中定义的字符指针char *numIn是未初始化的野指针:仅定义了指针变量本身,没有为其分配任何可读写的合法内存空间,指针保存的是栈上的随机垃圾值,fscanf执行%s格式读取时,会尝试向这个随机指向的内存位置写入字符串内容,由于该内存区域通常属于系统保护范围,没有访问权限,就会直接触发内存访问违规,抛出段错误。 - 代码存在的逻辑隐患会放大崩溃概率:文件打开失败的分支仅打印错误提示,没有终止程序流程,后续会拿着空的FILE指针调用fscanf、fclose接口,空指针操作本身就会触发段错误。
- 潜在的安全风险:就算给指针分配了内存,fscanf的
%s格式没有限制最大读取长度,如果待读取的单个字符串长度超过分配的缓冲区大小,会发生缓冲区溢出,破坏程序正常内存结构。
修复方案
对应问题逐点修正即可实现正常读取:
- 用固定大小的字符数组替代野指针,作为合法的字符串读写缓冲区,比如定义256长度的数组,足够存储普通文本中单个空白分隔的字符串内容。
- 文件打开失败时立即终止程序,避免后续空指针操作。
- 给fscanf的
%s格式增加读取长度限制,匹配缓冲区大小,预留1个字节的空间存储字符串结束符\0,从根源避免缓冲区溢出。
修复后可正常运行的代码
#include <stdlib.h> #include <stdio.h> int main() { FILE *spIn; // 定义合法的字符数组缓冲区,初始状态清零 char numIn[256] = {0}; spIn = fopen("data.txt", "r"); if (spIn == NULL) { printf("Can't Open This File \n"); // 打开失败直接退出,阻断后续空指针操作 return 1; } // 限制最多读取255个字符,刚好匹配256长度的缓冲区 while (fscanf(spIn, "%255s", numIn) == 1) { printf("%s\n", numIn); } fclose(spIn); return 0; }
修复后运行效果为:逐次读取data.txt中所有被空格、换行、制表符等空白字符分隔的独立内容,将每个内容单独打印一行,覆盖所有整数、字符串类的文本token。
内容的提问来源于stack exchange,提问作者Tyler Parker
相关产品推荐
相关产品推荐

