释放struct.name的内存(调试错误:HEAP CORRUPTION DETECTED)

时间:2016-12-18 11:48:22

标签: c arrays dynamic malloc free

我正在创建一个动态数组,其长度由用户输入,但是当我想free()分配了malloc()的内存时,它会给我一个“调试错误”

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免费?

1 个答案:

答案 0 :(得分:1)

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

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有一个指向解除分配内存的指针 - 即你有效地忘记了'输入后的数字。相反,当你完成free() ficha.nombre时,你应该ficha struct - 大概是调用者需要这个值。