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

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;
}

关键修改说明

  1. 把char *lexiconWord改为长度为256的字符数组,提前分配可写入的内存空间;%255[^;]限制最多读取255个字符,避免数组溢出。如果你的单词长度超过256,可以自行调大数组长度,或者改用malloc动态分配内存。
  2. 移除feof判断,直接用fscanf的返回值作为循环条件,避免最后一行重复读取的问题。
  3. 所有打印语句增加换行符,确保内容及时输出到控制台。
  4. 增加fclose调用释放文件资源,避免资源泄漏。

内容的提问来源于stack exchange,提问作者Lucas Nascimento

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 17:15:05