fclose 后无法释放 fileName char *

Cannot free fileName char * after fclose

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

Heap corruption detected: after normal block (#65) at 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() 调用,但仍然遇到同样的错误。

你的代码在下面一行有问题

strcat(*indexFileName, ".ind")

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

来自strcat()man page

... If dest (destination buffer) is not large enough, program behaviour is unpredictable;

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

也就是说,

  1. do not castmalloc()和家人C的return值。

  2. 根据 C 标准,
  3. sizeof(char) 保证为 1。你儿子不需要用那个。

解决方案[来自 by Mr. Mohit Jain]

将您的分配修改为:

int len = strlen(database) + strlen(".ind");   //allocate enough space to hold
*indexFileName = (char *)malloc(len + 1);      // the final concatenated string

这个

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

必须是

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

由于添加

的扩展

strcat(*indexFileName, ".ind")

我想问题出在 "strcpy(*indexFileName, database);" 指令中,

应该是strcpy(indexFileName, database);