C语言程序返回-1073741819(0xC0000005)指针使用问题求助
0xC0000005是Windows平台下典型的内存访问违规错误,你的代码存在多处指针使用错误和逻辑缺陷,具体问题如下:
原始代码核心错误点
- 字符串参数传参错误:
name(&Name[20], &last[20])以及writefile里传入的&Name[20],实际传递的是数组末尾的越界地址,而非数组首地址,gets写入时直接访问非法内存,是触发崩溃的直接原因之一。 date函数scanf参数错误:d、m、y本身已经是int*类型的指针,不需要再加取地址符&,scanf("%d", &d)会把输入值写到指针变量本身的内存地址,篡改指针指向,后续解引用操作必然触发非法内存访问,这也是输入日期后直接崩溃的核心原因。date函数循环判断逻辑错误:直接判断d<=0而非*d<=0,实际比较的是指针本身的内存地址,逻辑完全错误。income函数存在同样的scanf参数错误:ienakums已经是float*类型,不需要加&,scanf("%f", &ienakums)会篡改指针本身的值。- 姓氏校验逻辑错误:校验姓氏的循环里仍然用
vards(名字)的长度和内容做判断,完全没有校验uzvards(姓氏)的内容,且counter变量没有重置,第一次校验名字如果没有问题counter为0,后续即使姓氏包含数字也无法正确识别。 - 使用C标准已经废弃的
gets函数,极易引发缓冲区溢出问题,建议替换为fgets。 fflush(stdin)属于未定义行为,标准仅保证fflush对输出流有效,用于输入流无法达到清空缓冲区的预期效果,建议用while(getchar() != '\n');的方式清空输入缓冲区。
修改后代码遗留的问题
你调整了部分传参错误,但仍然存在以下问题:
- 姓氏校验逻辑错误未修复,还是校验名字的内容,
counter变量没有重置。 date函数打印语句:printf("\n %d %d %d",d,m,y);这里d、m、y是指针,直接打印会输出内存地址而非指向的数值,需要改为*d、*m、*y。income函数打印语句:printf("%f",ienakums);同样需要解引用,改为*ienakums。writefile函数写入参数错误:fprintf传入的d、m、y、ienakums都是指针,直接传参会写入内存地址而非实际数值,必须加*解引用。- 仍然保留了
gets和fflush(stdin)的错误用法。 - 校验姓氏的循环用
strlen(vards)做边界,如果姓氏长度比名字短,会触发字符串越界访问。
内容的提问来源于stack exchange,提问作者StrangeGamer
相关产品推荐
相关产品推荐

