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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 16:36:03