malloc错误:struct中读取文件的释放对象的校验和不正确

时间:2017-12-27 23:33:07

标签: c malloc

所以我有这个功能:

source_t * source_init(char * argsource)
{
    source_t * temp = (source_t *) malloc(sizeof(source_t *));
    temp->path = realpath(argsource, NULL);
    temp->dir = dirname(temp->path);
    temp->name = basename(temp->path);
    temp->ext = strrchr(temp->name, '.');
    temp->content = read_file(temp->path); // here
    temp->error = error_free();
    return temp;
}

它正在调用函数read_file()

char * read_file(char * sourcepath)
{
    char * buffer = NULL;
    long string_size, read_size;
    FILE * file = fopen(sourcepath, "r");
    fseek(file, 0, SEEK_END);
    string_size = ftell(file);
    rewind(file);
    buffer = (char *) malloc(sizeof(char) * (string_size + 1) );
    read_size = fread(buffer, sizeof(char), string_size, file);
    buffer[string_size] = '\0';
    if (string_size != read_size)
    {
        free(buffer);
        buffer = NULL;
    }
    fclose(file);
    return buffer;
}

并出现此错误:malloc: *** error for object 0x7faf08402698: incorrect checksum for freed object - object was probably modified after being freed.所以我当前的解决方案是在主函数中调用content之后单独初始化source_init()。虽然该解决方案有效,但我希望在content中初始化source_init()。此外,我似乎无法直接调用source_init()来初始化content,因为出现了相同的错误,所以我必须创建一个缓冲区来调用source_init()并初始化content到缓冲区

3 个答案:

答案 0 :(得分:5)

这可能不是你想要做的:

source_t * temp = (source_t *) malloc(sizeof(source_t *));

指针的空间分配给source_t对象,也不分配给source_t对象。

另外,在C中你不应该转换malloc的返回值。这样做可以隐藏错误,并使它们很难找到。

答案 1 :(得分:2)

扩展Thomas' answer

  1. 请勿投射malloccallocrealloc。这只是掩盖潜在的错误
  2. 如果可能,请在计算尺寸时不要使用sizeof(<data type>)。它很容易出错,并且会使你的代码重新分解成为****的痛苦。
  3. 改为使用

    source_t *temp = malloc(sizeof *temp);
    

    这样做的好处是sizeof *temp返回正确的字节数,你不必考虑正确的类型(比如当你处理双/三指针时),如果你需要更改数据类型,让我们说source2_t,然后您只需要更改变量的类型,而不必担心可以轻易忽略的令人讨厌的sizeof(<data type>)

答案 2 :(得分:-1)

在malloc()行的source_init()中,你有一个错误。

它应该是: source_t * temp = (source_t *) malloc(sizeof(source_t));

而不是: source_t * temp = (source_t *) malloc(sizeof(source_t *));