我正在尝试编写一个解析器来导入OBJ文件,但是即使在这个早期阶段,我在执行时仍遇到以下错误:
malloc: Incorrect checksum for freed object 0x7fd4f4c8bbd0: probably modified after being freed.
它设法在每行上打印缓冲区大小,所以我想知道问题是否与操作后关闭文件有关。
有人可以告诉我我做错了什么吗?我在macOS上运行。
int Utilities_Import_OBJ(const char *filename) {
// input checking
if (filename == NULL) {
printf("Unable to parse file, filename was NULL.\n");
return -1;
}
char *path = strcat(_resource_path, filename);
FILE *file = fopen(path, "r");
if (file == NULL) {
printf("Error opening %s\n", filename);
return -1;
}
// create a line buffer
const int length = 1024;
char buffer[length];
int index = 0;
// fgets stops reading at a \n and appends \0
while (fgets(buffer, sizeof(buffer), file)) {
printf("Buffer size at line %d : %d\n", index, sizeof(buffer));
index++;
}
// done with file, so close it
if (fclose(file) != 0) {
printf("Failed to close file!\n");
return -1;
}
return 0;
}
char *path = strcat(_resource_path, filename);
strcat
不会将2个字符串连接为分配的第三个字符串。它将第二个字符串复制到第一个字符串的末尾。根据_resource_path
的分配方式,这行很可能破坏malloc()
内部数据并最终产生问题。您应该编写这样的特定功能:
char *concat(const char *s1, const char *s2) {
size_t len1 = strlen(s1);
size_t len2 = strlen(s2);
char *p = malloc(len1 + len2 + 1);
if (p) {
memcpy(p, s1, len1);
memcpy(p + len1, s2, len2 + 1);
}
return p;
}
您将在使用后将free
返回的字符串设置为char *path = concat(_resource_path, filename);
。
printf("Buffer size at line %d : %d\n", index, sizeof(buffer));
缓冲区大小是恒定的,sizeof(buffer)
始终求值为在定义length
的点处具有的值buffer
(1024)。此外,应将%zu
用于size_t
参数,而不是%d
,因为它期望int
的大小可能不同。您可能要改写这个:
printf("Buffer length at line %d: %zu\n", index, strlen(buffer));