【问题标题】:Freeing memory for struct.name (debug error: HEAP CORRUPTION DETECTED)为 struct.name 释放内存(调试错误:HEAP CORRUPTION DETECTED)
【发布时间】:2016-12-18 11:48:21
【问题描述】:

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

【问题讨论】:

  • C 中不需要投malloc & 朋友,也不以任何方式推荐。
  • OT:为避免在扫描时溢出目标缓冲区,请执行scanf("%Ns",nombreTam);,其中N 是缓冲区-1 的大小。所以在这里:scanf("%99s",nombreTam);

标签: c arrays dynamic malloc free


【解决方案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 有一个指向已释放内存的指针 - 即,一旦输入数字,您就会有效地“忘记”它。相反,当您完成 ficha struct 后,您应该是 free()ing ficha.nombre - 大概调用者毕竟需要该值。

【讨论】:

  • 好吧,一切都很好,但是放弃那些无用的演员表。
  • @alk 确实如此。固定。
  • 好的,现在它可以工作了,但现在它没有返回结构,我怎样才能返回结构并释放内存?
  • @Albermonte 删除free(),并在您实际完成struct 后释放内存。
  • @Albermonte:这将是另一个问题...... :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多