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

C语言进制转换调用malloc后崩溃,错误码-1073740940如何解决?

问题排查与修复方案

你遇到的返回值-1073740940是Windows平台的堆损坏错误码(对应0xC0000374),本质是代码存在越界写入操作破坏了堆结构,导致malloc执行时触发系统堆校验逻辑失败直接崩溃。以下是具体问题和修复方案:

核心问题列表

  • 未定义的bad变量
    代码中直接使用bad = 1赋值,如果bad未定义为全局变量会直接编译失败,即使定义为全局变量也存在线程安全问题,建议改为用函数返回值标识错误状态。
  • 进制相同分支缺少字符串结束符
    当输入输出进制相同时,仅拷贝了输入字符串的字符内容,没有在末尾补'\0',后续对out执行字符串操作会触发越界读取。
  • fill函数逻辑严重错误
    调用fill(out)清理输出数组时,传入的out是刚申请的堆内存,内容为随机值,strlen(x)会从随机内容中查找'\0'计算长度,返回值完全不可控,会导致大规模越界写入,直接破坏堆结构,这是malloc报错的核心诱因之一。
  • 数组越界写入风险
    你给carry、end申请的内存是固定的4000个int,但是filli时传入的len2 = which * le +3,当输入字符串较长时,len2很容易超过4000,此时filli会超出malloc的内存范围写入,直接破坏堆的元数据,导致下一次malloc时系统检测到堆损坏直接崩溃。
  • 输出结果缺少结束符
    转换完成后执行的out[tmp] = out[tmp + 1];完全没有意义,应该改为out[tmp] = '\0';给字符串加结束符,否则后续读取out会读到垃圾值甚至越界。
  • malloc返回值未校验
    所有malloc调用后都应该判断返回值是否为NULL,避免内存申请失败时写入空指针触发崩溃。

快速修复方案

你可以先做以下修改快速验证功能:

  1. 修改fill函数,传入内存大小而非用strlen计算:
void fill(char* x, int size)
{
    for (int i = 0; i < size; i++)
    {
        x[i] = 0;
    }
    return;
}
// 调用时改为fill(out, N);
  1. 给carry、end做初始化时,直接传入N作为长度,避免越界:
filli(N, carry);
filli(N, end);
  1. 进制相同分支末尾添加字符串结束符:
if (input == output) {
    for (int i = 0; i < length; i++)
    {
        out[i] = x[i];
    }
    out[length] = '\0'; // 新增这行
    return;
}
  1. 转换完成后给输出加结束符:
// 删掉out[tmp] = out[tmp + 1]; 改为以下内容
out[tmp] = '\0';

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 09:24:03