在fclose之后无法释放fileName char *

时间:2015-06-12 07:04:47

标签: c memory-management malloc free realloc

我正在尝试释放我的文件名(char *指针),但收到错误:

  

检测到堆损坏:正常阻止(#65)在0x ....

之后

代码:

static FILE *initializeIndexFile(char *database, char **indexFileName)
{
    FILE *file1_p;
    *indexFileName = NULL;
    int len = strlen(database);
    *indexFileName = (char *)malloc(len *sizeof(char) + 1);
    strcpy(*indexFileName, database);
    file1_p = fopen(strcat(*indexFileName, ".ind"), "rb");
    if (file1_p == NULL)
        Handle_Failure();
    fclose(file1_p);
    free(*indexFileName);
    return file1_p;
}

首先我对它进行了修改,因为文件仍处于打开状态,所以我调用了fclose()但仍然遇到了同样的错误。

3 个答案:

答案 0 :(得分:2)

您的代码在下面的行中有问题

strcat(*indexFileName, ".ind")

*indexFileName处的目标缓冲区没有足够的内存来保存连接的字符串。因此它会调用undefined behaviour

来自strcat()

man page
  

...如果dest(目标缓冲区)不够大,程序行为是不可预测的;

因此,一旦调用UB,就没有特定的行为可以预测或期望。

那就是说,

  1. malloc() Csizeof(char)中的家人返回do not cast

  2. 1保证C符合int len = strlen(database) + strlen(".ind"); //allocate enough space to hold *indexFileName = (char *)malloc(len + 1); // the final concatenated string 标准。你不需要使用它。

  3. 解决方案 [来自deleted answer Mohit Jain先生

    将您的分配修改为:

    {{1}}

答案 1 :(得分:0)

这个

*indexFileName = (char *)malloc( len *sizeof(char) + 1);

必须是

*indexFileName = (char *)malloc( len *sizeof(char) + 5);

由于扩展添加了

strcat(*indexFileName, ".ind")

答案 2 :(得分:0)

我认为问题出在“strcpy(* indexFileName,database);”指令,

它应该是strcpy(indexFileName,database);