无法释放父结构的子级

时间:2018-11-07 18:41:21

标签: c memory struct malloc

我遇到了一个怪异的错误,我无法释放()我为malloc()RAM使用的结构。

我有一个父级和子级结构,其中child是一个int型结构。我使用malloc()为父结构和子结构分配ram(其中子结构是malloc()到子结构数组的大小)。然后,我使用memcpy将数组复制到父结构。

#include <stdlib.h>
#include <stdio.h>
#include <string.h> 

typedef struct child child_t;
typedef struct parent parent_t;

struct child {
    int item;
};

struct parent {
    child_t *_child;
};

child_t list[] = {
    { .item = 1 },
    { .item = 2 },
    { .item = 3 },
};

int main(void) {
    parent_t *_parent = malloc(sizeof(parent_t));

    _parent->_child = malloc(sizeof(list));
    memcpy(&_parent->_child, &list, sizeof(list));

    free(_parent->_child);
    free(_parent);
    printf("success\n");
    return 1;
}

free(_parent->_child);最终给了我异常终止(核心转储)的错误。我检查了撞锤的使用情况,可以告诉我应该释放孩子,但是我不确定该怎么做。

2 个答案:

答案 0 :(得分:6)

您应该从&语句中删除memcpy_parent->_child已经是一个地址,并且数组list[]将衰减为指针。您正在执行的操作是覆盖指针成员本身(和其他成员)而不是其指向的内存。

memcpy(_parent->_child, list, sizeof(list));

这就是为什么你不能

free(_parent->_child);

因为您丢弃了要尝试free的指针。

答案 1 :(得分:0)

memcpy(&_parent->_child, &list, sizeof(list));是问题所在。

尝试:

memcpy(_parent->_child, list, sizeof(list));

memcpy的签名是:

void *memcpy(void *str1, const void *str2, size_t n)

您将指针传递给了指针。

这会触发未定义的行为,因为您的缓冲区基本上包含free()无法使用的垃圾。