代码之家  ›  专栏  ›  技术社区  ›  Fulmineo

我的C代码运行良好,但在结束前崩溃(0xC0000374)

  •  0
  • Fulmineo  · 技术社区  · 5 月前

    所以我现在正在学习(用C)编程几个月,我在这里专注于内存分配。

    我的代码很简单,一切正常,但最后它没有返回0,而是得到-1073740940(0xC0000374),我注意到这与内存分配有关(哈哈)。说真的,我不知道该怎么纠正。

    这是:

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <string.h>
    
    int main()
    {
    
     char* chaine1 = (char*)malloc(10*sizeof(char));
     char* chaine2 = (char*)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);
    
     char* tmp_chaine = (char*)malloc(sizeof(char)*10);
    
     if(tmp_chaine == NULL)
        return -2;
    
     strcpy(tmp_chaine, chaine1);
    
     realloc(chaine1, sizeof(char)*(taille1+taille2+1));
    
     for(int i = 0; i <= taille1; i++)
        chaine1[i] = tmp_chaine[i];
    
     for(int i = 0; i <= taille2; i++)
        chaine1[taille1+i] = chaine2[i];
    
    printf("%s", chaine1);
    
    return 0;
    }
    

    我注意到,当我试图释放字符串时,程序在结束前崩溃了,但这就是我所能想到的。

    (我知道代码没有优化,请不要对我大喊大叫:()

    1 回复  |  直到 5 月前
        1
  •  3
  •   3CxEZiVlQ    5 月前

    代码0xC0000374是_健康损坏。堆损坏的发生是因为 realloc() 使用不当。

    realloc(chaine1, sizeof(char)*(taille1+taille2+1));
    

    忽略返回的新指针, chaine1 指针不变,指向旧的已释放内存位置。其他行使用了错误的内存位置并损坏了堆。

    您可以在上面几行中分配所需的大小 malloc() 不使用 realloc() .

    如果你还想试试 realloc() 那么应该是

    char* new_chaine1 = realloc(chaine1, taille1+taille2+1);
    if (new_chaine1) {
      chaine1 = new_chaine1;
      new_chaine1 = NULL;
    } else {
      // handle the reallocation error
    }
    

    代码在以下位置显示内存泄漏 main() 没有 free() .

    进一步说明。 sizeof(char) 奇数,总是1,可以省略。 (char*) 演员从 void* 不需要 malloc() .