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

