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,就没有您可以预测或预期的特定行为。
也就是说,
请do not castmalloc()
和家人C
的return值。
根据 C
标准,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);
我正在尝试释放我的文件名(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,就没有您可以预测或预期的特定行为。
也就是说,
请do not cast
malloc()
和家人C
的return值。
根据 sizeof(char)
保证为1
。你儿子不需要用那个。
C
标准,解决方案[来自
将您的分配修改为:
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);