我遇到了一个奇怪的错误,我无法释放((一个我用malloc((将RAM用于的结构。
我有一个结构parent和child,其中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("successn");
return 1;
}
free(_parent->_child);
最终给了我一个错误Aborted(核心转储(。我已经检查了ram的使用情况,我可以判断我应该释放孩子,但我不确定如何做到这一点。
您应该从memcpy
语句中删除&
s。_parent->_child
已经是一个地址,而数组list[]
将衰减为一个指针。您所做的操作的效果是覆盖指针成员本身(和其他(,而不是它所指向的内存。
memcpy(_parent->_child, list, sizeof(list));
这就是为什么你不能
free(_parent->_child);
因为你破坏了指向free
的指针。
memcpy(&_parent->_child, &list, sizeof(list));
就是问题所在。
试用:
memcpy(_parent->_child, list, sizeof(list));
memcpy
的签名为:
void *memcpy(void *str1, const void *str2, size_t n)
而您正在将一个指针传递给一个指针。
这会触发未定义的行为,因为缓冲区基本上包含free()
无法使用的垃圾。