c-无法释放父结构的子结构



我遇到了一个奇怪的错误,我无法释放((一个我用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()无法使用的垃圾。

相关内容

  • 没有找到相关文章

最新更新