malloc:释放的对象0x7fd4f4c8bbd0的校验和不正确:释放后可能已修改

问题描述 投票:1回答:1

我正在尝试编写一个解析器来导入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;
}
c malloc fgets
1个回答
0
投票
您的代码中有2条令人惊讶的行:

  • 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));

© www.soinside.com 2019 - 2024. All rights reserved.