我正在创建一个动态数组,其长度由用户输入,但是当我想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
免费?
答案 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
- 大概是调用者需要这个值。