fscanf执行前初始化空指针导致程序崩溃的问题如何解决?
问题根因
- 核心崩溃原因:你声明的
char *lexiconWord是未分配内存的野指针,没有指向合法的可写入内存空间。fscanf读取字符串时会直接向该指针指向的随机非法地址写入数据,触发内存访问错误直接崩溃,和你代码里初始化的int *a = NULL没有任何关联,属于误判。 - 潜在逻辑问题:
feof会在文件读取操作失败后才返回真,当前写法会导致最后一行内容被重复读取一次。 - 输出缓冲问题:
printf("before while")没有加换行符,标准输出默认是行缓冲,程序崩溃时缓冲区内容未被刷出,可能会干扰你对代码执行位置的判断。
修复方案
修复后完整代码
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { FILE * filePointer = fopen("_lexico_shuf.txt", "r"); if(!filePointer) { printf("can't open the file\n"); exit(101); } // 改为固定长度字符数组,提前分配好写入空间,可根据实际单词长度调整大小 char lexiconWord[256]; float polarity; printf("before while\n"); // 直接用fscanf返回值作为循环条件,返回值等于2说明两个字段都读取成功 while (fscanf(filePointer, "%255[^;];%f\n", lexiconWord, &polarity) == 2) { printf("| (%s) (%.1f) |\n", lexiconWord, polarity); } printf("after while\n"); fclose(filePointer); return 0; }
关键修改说明
- 把
char *lexiconWord改为长度为256的字符数组,提前分配可写入的内存空间;%255[^;]限制最多读取255个字符,避免数组溢出。如果你的单词长度超过256,可以自行调大数组长度,或者改用malloc动态分配内存。 - 移除
feof判断,直接用fscanf的返回值作为循环条件,避免最后一行重复读取的问题。 - 所有打印语句增加换行符,确保内容及时输出到控制台。
- 增加
fclose调用释放文件资源,避免资源泄漏。
内容的提问来源于stack exchange,提问作者Lucas Nascimento
相关产品推荐
相关产品推荐

