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

malloc错误:读取文件的struct中释放对象的校验和不正确,c,malloc,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);

所以我有这个函数:

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;
}
它正在调用函数
读取文件()


出现此错误:
malloc:**object 0x7faf08402698的错误:释放的对象的校验和不正确-对象可能在被释放后被修改。
因此,我当前的解决方案是在调用主函数中的
source_init()
后单独初始化
内容。尽管该解决方案有效,但我希望
内容
源代码
中进行初始化。另外,我似乎无法直接调用
source\u init()
来初始化
内容
,因为出现了相同的错误,所以我必须创建一个缓冲区来调用
source\u init()
,并初始化
内容
来缓冲。

这可能不是您想要做的:

source_t * temp = (source_t *) malloc(sizeof(source_t *));
为指向源对象的指针或源对象分配空间的


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

这可能不是您想要做的:

source_t * temp = (source_t *) malloc(sizeof(source_t *));
为指向源对象的指针或源对象分配空间的

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

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

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

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

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

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

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

在上展开

  • 不要播放
    malloc
    calloc
    realloc
    。这只是掩盖了潜在的错误
  • 如果可能,在计算尺寸时不要使用
    sizeof()
    。在****中,很容易犯错误并使代码的重新分解成为一种痛苦
  • 用这个代替

    source_t *temp = malloc(sizeof *temp);
    
    这样做的好处是
    sizeof*temp
    返回的字节数准确无误,您不必考虑正确的类型(如处理双/三指针时),如果您必须更改数据类型,可以使用
    source2\u t
    ,然后,您只需更改变量的类型,而不必担心容易被忽略的讨厌的
    sizeof()

    继续

  • 不要播放
    malloc
    calloc
    realloc
    。这只是掩盖了潜在的错误
  • 如果可能,在计算尺寸时不要使用
    sizeof()
    。在****中,很容易犯错误并使代码的重新分解成为一种痛苦
  • 用这个代替

    source_t *temp = malloc(sizeof *temp);
    

    这样做的好处是
    sizeof*temp
    返回的字节数准确无误,您不必考虑正确的类型(如处理双/三指针时),如果您必须更改数据类型,可以使用
    source2\u t
    ,然后,您只需更改变量的类型,而不必担心容易被忽略的讨厌的
    sizeof()

    除了可维护性之外,另一个原因是使用表单
    source\t*temp=malloc(sizeof(*temp))可维护性之上的另一个原因是使用表格
    source\t*temp=malloc(sizeof(*temp))你说“首先”。。。你看到第二个问题了吗?你说“首先”。。。你看到的还有第二个问题吗?