我正在使用用户输入的名称长度创建动态数组,但是当我想要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
?
最佳答案
您正确地找到了字符串的长度:
tamNombre=strlen(nombreTam);
但是当你分配内存时:
ficha.nombre=(char *)malloc(tamNombre*sizeof(char));
您只为字符串的字符分配足够的内存,而不是终止 NUL。你想要:
ficha.nombre=(char *)malloc(tamNombre*sizeof(char)+1);
但如 char
C 标准保证大小为 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()
ing ficha.nombre
当您完成 ficha
后struct
- 大概调用者毕竟需要该值。
关于c - 释放 struct.name 的内存(调试错误 : HEAP CORRUPTION DETECTED),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41208036/