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,避免内存申请失败时写入空指针触发崩溃。
快速修复方案
你可以先做以下修改快速验证功能:
- 修改
fill函数,传入内存大小而非用strlen计算:
void fill(char* x, int size) { for (int i = 0; i < size; i++) { x[i] = 0; } return; } // 调用时改为fill(out, N);
- 给
carry、end做初始化时,直接传入N作为长度,避免越界:
filli(N, carry); filli(N, end);
- 进制相同分支末尾添加字符串结束符:
if (input == output) { for (int i = 0; i < length; i++) { out[i] = x[i]; } out[length] = '\0'; // 新增这行 return; }
- 转换完成后给输出加结束符:
// 删掉out[tmp] = out[tmp + 1]; 改为以下内容 out[tmp] = '\0';
内容的提问来源于stack exchange,提问作者Martfosz
相关产品推荐
相关产品推荐

