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

C语言调用含fscanf的readData函数后程序崩溃原因排查

问题描述

使用fscanf从文本文件读取数据时,执行封装的readData函数后程序直接崩溃,循环逻辑未触发运行,控制台仅打印"Data is read"提示;将数据读取逻辑直接写在main函数中时程序可正常运行,需要将读取逻辑封装为独立函数实现。
问题复现代码如下:

#include <stdio.h>
#include <stdio.h>

void readData(int array[10][3]);

int main(void)
{
    int data[10][3],i;
    
    readData(data);
    
    for(i=0; i<10; i++)
    {
        printf("%d %d %d \n",data[i][0],data[i][1],data[i][2]);
    }
}

void readData(array[10][3])
{
    int i;
    
    FILE *ptr = fopen("phonedata.txt","r");
    if(ptr == NULL)
    {
        printf("There is no file");
    }
    else
    {
        printf("Data is read");
    }
    
    while(fscanf(ptr, "%d %d %d",&array[i][0],&array[i][1],array[i][2]) != EOF);
    {
        i++;
    }
}
错误原因
  • 函数形参类型缺失:readData实现时的形参array[10][3]未声明int类型,不符合标准C语法,会引发参数传递的未定义行为。
  • 循环变量未初始化:函数内局部变量i没有赋初始值,是栈上的随机垃圾值,直接作为数组下标访问会读写非法内存,直接触发崩溃。
  • while语句末尾多余分号:分号会将while判定为空语句循环,后续大括号包裹的i++逻辑永远不会进入执行,和观察到的循环未触发现象完全匹配。
  • fscanf参数缺失取地址符:读取第三个整数字段时传入的是array[i][2](值)而非&array[i][2](内存地址),fscanf需要目标变量的地址才能写入读取结果,会触发非法内存写入错误。
  • 异常分支无返回逻辑:如果文件打开失败(ptr==NULL),代码打印提示后仍会继续执行后续fscanf逻辑,对空文件指针操作会直接崩溃。
  • 无越界保护:目标数组最多存储10组三元组数据,循环未加i<10的边界判断,读取数据量超过数组容量时会发生内存越界写入。
  • 重复引入头文件,且文件读取完成后未调用fclose释放文件资源。
修正后可运行代码
#include <stdio.h>

void readData(int array[10][3]);

int main(void)
{
    int data[10][3],i;
    
    readData(data);
    
    for(i=0; i<10; i++)
    {
        printf("%d %d %d \n",data[i][0],data[i][1],data[i][2]);
    }
    return 0;
}

void readData(int array[10][3])
{
    int i = 0;
    
    FILE *ptr = fopen("phonedata.txt","r");
    if(ptr == NULL)
    {
        printf("There is no file");
        return;
    }
    printf("Data is read\n");
    
    while(i<10 && fscanf(ptr, "%d %d %d", &array[i][0], &array[i][1], &array[i][2]) == 3)
    {
        i++;
    }

    fclose(ptr);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.04 16:15:41