C语言运行时testing.exe触发断点 报无效参数异常如何解决
问题原因与修复方案
报错的直接触发原因是fopen打开文件失败后返回空指针,后续调用fgetc(fp)时传入了空指针作为参数,触发了运行时的无效参数异常,和你给出的报错信息、报错位置完全匹配。
你的代码还存在多个隐藏问题,整理如下:
- 问题1:未对
fopen的返回值做非空校验
当目标文件p3-in1.txt不存在、文件路径错误、没有读取权限时,fopen会返回NULL,直接将空指针传入fgetc就会触发你遇到的报错。 - 问题2:
fgetc返回值用char类型接收错误fgetc的返回值是int类型,一是为了容纳EOF(通常为-1)这个超出char取值范围的标识,二是避免读取到值为0xFF的字符时被误判为EOF。 - 问题3:多余的
ch++逻辑(大概率是笔误)
你当前的代码会把读取到的字符值+1后再写入目标数组,如果不是业务刻意要求的逻辑,这是错误的笔误。 - 问题4:未做缓冲区溢出防护
你定义的message数组长度为5000,当读取的文件内容超过4999字节时,写入操作会越界,触发内存访问异常。 - 问题5:缺少文件关闭逻辑
文件读取完成后没有调用fclose释放文件资源,会造成资源泄漏。 - 问题6:隐式函数声明问题
代码中调用的encrypt、output函数没有给出声明或实现,编译阶段会触发隐式声明警告,运行时也可能出现未定义行为。
修复代码示例
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <ctype.h> // 此处补充encrypt、output函数的声明或实现 // 修复后的input函数,新增缓冲区最大长度参数防越界 void input(char* file_name, char* str, int max_buf_len) { FILE* fp; fp = fopen(file_name, "r"); // 新增空指针校验 if (fp == NULL) { perror("文件打开失败"); // 打印具体错误原因,比如找不到文件、权限不足等 *str = '\0'; // 给目标字符串置空避免后续逻辑出错 return; } int ch; // 改成int类型接收fgetc返回值 int write_cnt = 0; while ((ch = fgetc(fp)) != EOF && write_cnt < max_buf_len -1) { // 新增越界判断 *str++ = ch; // 去掉多余的ch++ write_cnt++; } *str = '\0'; fclose(fp); // 关闭文件释放资源 } int main() { char file_name[25] = "p3-in1.txt"; int code[] = { 6, 2, -1, 3, 2, 4, -3, 3, 1, -5, 4 }; int length = 11; char message[5000]; input(file_name, message, sizeof(message)); // 传入缓冲区长度 encrypt(code, length, message, 0); output(message); encrypt(code, length, message, 1); output(message); return 0; }
排查建议
优先确认p3-in1.txt文件和编译生成的testing.exe在同一个目录下,也可以填写绝对路径(比如"C:\\test\\p3-in1.txt")测试文件能否正常打开。
内容的提问来源于stack exchange,提问作者axis100
相关产品推荐
相关产品推荐

