我遇到了一个怪异的错误,我无法释放()我为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);
最终给了我异常终止(核心转储)的错误。我检查了撞锤的使用情况,可以告诉我应该释放孩子,但是我不确定该怎么做。
答案 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()
无法使用的垃圾。