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

