c语言 - 释放内存用于 struct.name(调试错误:检测到堆损坏)



我正在使用用户输入的名称长度创建动态数组,但是当我想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); 

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

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

而且由于你不需要投射malloc()的回归,最简单的是:

ficha.nombre=malloc(tamNombre+1); 

如果没有此更改,strcpy将写入超出分配内存的末尾,这可能是导致问题的原因。

但是,您正在做的事情似乎也很奇怪:

free(ficha.nombre);

无论如何,在此函数中。这保证了fichastruct有一个指向已释放内存的指针 - 即您实际上在输入数字后立即"忘记"该数字。相反,您应该在完成fichastructfree()ficha.nombre- 大概调用者毕竟需要该值。

相关内容

  • 没有找到相关文章

最新更新