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

C语言程序运行正常但结束前崩溃(错误码0xC0000374)求助

问题分析与修复方案

错误码0xC0000374对应Windows系统的堆内存损坏,你的代码核心问题出在realloc的错误使用,同时存在内存泄漏问题,具体如下:

关键错误点

  • realloc未接收返回值:realloc在扩容内存时,可能会将数据迁移到新的内存地址并释放原地址,原指针会变成野指针。你直接调用realloc(chaine1, sizeof(char)*(taille1+taille2+1))但没有把返回值赋值给chaine1,后续对chaine1的写入操作会破坏堆结构,导致程序崩溃或返回错误码。
  • 内存泄漏:tmp_chaine、chaine1、chaine2都未调用free()释放内存,虽然程序退出后系统会回收,但这是C语言内存管理的不良习惯,且堆损坏后尝试释放会直接崩溃。
  • 冗余的临时内存复制:tmp_chaine完全没必要——realloc会自动处理原内存的数据迁移(如果需要的话),手动复制属于多余操作,反而增加出错风险。

修正后的代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char* chaine1 = malloc(10 * sizeof(char));
    char* chaine2 = malloc(10 * sizeof(char));

    if(chaine1 == NULL || chaine2 == NULL)
        return -2;

    strcpy(chaine1, "Salut les");
    strcpy(chaine2, " codeurs!");

    printf("Chaine 1: %s\n", chaine1);
    printf("Chaine 2: %s\n", chaine2);

    int taille1 = strlen(chaine1);
    int taille2 = strlen(chaine2);

    // 接收realloc的返回值,并检查是否分配成功
    char* new_chaine1 = realloc(chaine1, sizeof(char) * (taille1 + taille2 + 1));
    if(new_chaine1 == NULL) {
        // 分配失败时要先释放原内存,避免泄漏
        free(chaine1);
        free(chaine2);
        return -2;
    }
    chaine1 = new_chaine1;

    // 直接拼接字符串,替代手动循环复制
    strcat(chaine1, chaine2);

    printf("%s\n", chaine1);

    // 释放所有动态分配的内存
    free(chaine1);
    free(chaine2);

    return 0;
}

额外说明

  • 不需要强制转换malloc/realloc的返回值,C语言会自动将void*转换为对应指针类型,强制转换反而可能隐藏潜在的编译错误。
  • 使用strcat替代手动循环拼接字符串,既简洁又能避免索引越界的问题。
  • 调用realloc失败时,一定要释放原内存块,防止内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 14:05:05