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

Win11下VSCode运行C程序报退出码3221225477问题排查

问题根因

错误码3221225477对应十六进制值0xC0000005,是Windows平台标准的内存访问违例错误,由代码中的堆缓冲区溢出触发。旧Windows 10设备、在线C编译器的堆内存布局、安全校验规则更宽松,溢出写入没有命中受保护的内存区域,因此没有触发崩溃;Windows 11默认启用更严格的堆保护机制,越界写入会被系统直接捕获,终止程序运行,和杀毒软件、VSCode版本无直接关联。

Bug定位

核心问题出在bearing()函数的内存分配逻辑:

  • 函数中为方位结果字符串仅分配了7*sizeof(char)的堆空间,但带角度的方位字符串格式为"N XX.XX E"/"S XX.XX W"这类形式,单条字符串包含9个可见字符+1个字符串结束符\0,至少需要10字节存储空间。
  • 调用sprintf()写入字符串时,内容超出了分配的内存边界,破坏了堆内存的管理元数据,触发系统内存保护机制。
  • 代码还存在两个不直接触发崩溃的隐患:所有malloc()调用未做返回值校验,程序退出前未释放动态申请的内存,存在内存泄漏。
修复步骤
  • 修改bearing()函数的内存分配大小,预留足够冗余避免溢出:
    将原代码中:
char *bearing = (char *)malloc(7*sizeof(char));

替换为:

// 分配16字节足够存储最长方位字符串,预留格式调整冗余
char *bearing = (char *)malloc(16*sizeof(char));
if (bearing == NULL) { // 增加内存分配失败校验
    perror("内存分配失败");
    exit(EXIT_FAILURE);
}
  • (可选优化)在main()函数的return 0;语句前增加内存释放逻辑,避免内存泄漏:
// 释放所有动态申请的内存
free(bng_ba);
free(bng_dc);
free(bng_xa);
free(bng_xc);
free(point_x);
free(point_a);
free(point_b);
free(point_c);
free(point_d);

修改完成后重新编译即可正常运行,不会再出现异常退出的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 09:18:27