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
相关产品推荐
相关产品推荐

