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

标签 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

最佳答案

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

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当您完成 fichastruct - 大概调用者毕竟需要该值。

关于c - 释放 struct.name 的内存(调试错误 : HEAP CORRUPTION DETECTED),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41208036/

相关文章:

c - 为什么指针 "forget"尽管指向 malloc 内存,但其值却是 0x104567910

javascript - 将我的 Javascript 数组放入表中

javascript - 在 Ruby 中动态命名数组/哈希

.net - 查找性能 : Array, 列表还是字典?

javascript - 查找数组中最接近的较小值

android - 无法从动态添加的复选框中获取值

javascript - 如何使用 JS 根据图像制作动态横幅更改背景颜色?

c - gcc 在更改变量声明顺序后保留内存分配

c - 用 GCC 编译的 16 位 C 代码

c++ - 在 UNIX 进程之间交换适度大量数据的最佳方法是什么?