我正在尝试释放我的文件名(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()
但仍然遇到了同样的错误。
答案 0 :(得分:2)
您的代码在下面的行中有问题
strcat(*indexFileName, ".ind")
*indexFileName
处的目标缓冲区没有足够的内存来保存连接的字符串。因此它会调用undefined behaviour。
来自strcat()
...如果dest(目标缓冲区)不够大,程序行为是不可预测的;
因此,一旦调用UB,就没有特定的行为可以预测或期望。
那就是说,
请malloc()
C
和sizeof(char)
中的家人返回do not cast。
1
保证C
符合int len = strlen(database) + strlen(".ind"); //allocate enough space to hold
*indexFileName = (char *)malloc(len + 1); // the final concatenated string
标准。你不需要使用它。
解决方案 [来自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);