Freeing memory for struct.name (debug error: HEAP CORRUPTION DETECTED)

Freeing memory for struct.name (debug error: HEAP CORRUPTION DETECTED)

我正在使用用户输入的名称长度创建动态数组,但是当我想要 free() 分配给 malloc() 的内存时,它给了我一个 "Debug error"

typedef struct
{
    char *nombre;
    float nota;
} tficha;

tficha leeFicha() 
{
    char nombreTam[100]; 
    int tamNombre;      
    tficha ficha;       
    scanf("%s",nombreTam); 
    tamNombre=strlen(nombreTam); 
    ficha.nombre=(char *)malloc(tamNombre*sizeof(char)); 
    strcpy(ficha.nombre,nombreTam); 
    free(ficha.nombre); // Here is giving me a Debug Error (HEAP CORRUPTION DETECTED: after Normal block (#166) at 0x0065C450. CRT detected that the application wrote to memory after end of heap buffer.)
    return ficha;       
}

如何才能不出错地释放 ficha.nombre

您正确地找到了字符串的长度:

tamNombre=strlen(nombreTam); 

但是当你分配内存时:

ficha.nombre=(char *)malloc(tamNombre*sizeof(char)); 

您只为字符串的字符分配了足够的内存,而不是终止 NUL。你想要:

ficha.nombre=(char *)malloc(tamNombre*sizeof(char)+1); 

但是由于 C 标准保证 char 的大小为 1,您可以这样写:

ficha.nombre=(char *)malloc(tamNombre+1); 

you don't need to cast the return of malloc()一样,最简单的是:

ficha.nombre=malloc(tamNombre+1); 

如果不进行此更改,strcpy 将超出已分配内存的末尾进行写入,这可能是导致您出现问题的原因。

但是,你做的事情也很奇怪:

free(ficha.nombre);

无论如何都在这个函数中。这保证了 ficha struct 有一个指向释放内存的指针——也就是说,你在输入数字后立即有效地 'forget' 。相反,当您完成 ficha struct 后,您应该 free()ing ficha.nombre - 大概调用者毕竟需要该值。