在C中使用自由功能时,内存在块中损坏

时间:2014-11-06 21:38:29

标签: c memory-management memory-leaks

我编写了一些代码,可以将一些信息写入目录中的每个xml文件。要检查,如果文件是XML,我确实strncpy获取格式。 strncpy的结果放入char指针。在任务之后我释放了结果指针。但是当我试图释放它时,我得到错误说:

致命:file1.c:1449:阻塞后内存损坏(0xad41d2,5个字节)     prev块:file2.c:137(0xa4d5a2,320字节)     下一个块:file1.c:1449(0xbe6ee2,5个字节)

如果我评论免费声明,我会看到警告,一切正常。

这是我的代码:

while ((in_file = readdir(FD)))
    {
        if (!strcmp (in_file->d_name, "."))
            continue;
        if (!strcmp (in_file->d_name, ".."))
            continue;

        char *output=(char*)xmalloc(sizeof(char)*5);
        /* Open directory entry file for common operation */
        strncpy(output, in_file->d_name+strlen(in_file->d_name)-5,5);
        output[5]='\0';

        /* open only xml files */
        if(strcmp(output,"_.xml")==0)
        {

            entry_file = fopen(in_file->d_name, "a");
            if (entry_file == NULL)
            {
                printf("Error : Failed to open entry file - %s\n", strerror(errno));
                fclose(entry_file);

                return;
            }
            fprintf(entry_file,"</component>\n");
            fclose(entry_file);
        }
    //  free(output); /* FIXME This line gives me error*/

    }

有人可以帮我解决这里出了什么问题以及为什么我会收到错误吗?

2 个答案:

答案 0 :(得分:3)

这是无效的访问权限:

output[5]='\0';

你在这里分配了5个字符的空间

char *output=(char*)xmalloc(sizeof(char)*5);

但可以使用的有效索引是0 - 4。


另外,为什么分配?只需声明一个5的char数组。

char output[5];

或者更好的是,因为你需要终止空字节,所以要做一个包含6个字符的数组。

char output[6];

通过动态分配内存,你在这里打开了内存泄漏:

if (entry_file == NULL)
{
   printf("Error : Failed to open entry file - %s\n", strerror(errno));
   fclose(entry_file);
   return;  // forgot to free() the memory
}

以及可能发生返回的任何其他地方(无论是当前代码还是将来的编码更改)。

答案 1 :(得分:2)

考虑以下两行:

char *output=(char*)xmalloc(sizeof(char)*5);

您已将output分配为五个字符output[0]output[4]

output[5]='\0';

output[5]超出此范围。行为未定义。