我编写了一些代码,可以将一些信息写入目录中的每个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*/
}
有人可以帮我解决这里出了什么问题以及为什么我会收到错误吗?
答案 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]
超出此范围。行为未定义。