c - 无法释放父结构的子结构
问题描述
我有一个奇怪的错误,我无法释放()我 malloc()'d RAM 的结构。
我有一个结构父母和孩子,其中孩子是一个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);
只是最终给我 Aborted (core dumped) 作为错误。我检查了 ram 的使用情况,我可以告诉我应该释放孩子,但我不知道该怎么做。
解决方案
您应该从语句中删除&
s 。已经是一个地址,数组将衰减为一个指针。您正在做的事情是覆盖指针成员本身(和其他)而不是它指向的内存。memcpy
_parent->_child
list[]
memcpy(_parent->_child, list, sizeof(list));
这就是为什么你不能
free(_parent->_child);
因为你破坏了你试图指向的指针free
。
推荐阅读
- javascript - 省略或跳过图表js中x轴区域的间隔
- hadoop - Impala 和 mem_limit
- android - Android MotionLayout 在 RecyclerView 滚动时崩溃
- python - 属性错误:“_tkinter.tkapp”对象没有属性“根”
- scala - 如何在 IntelliJ IDEA 中添加新的 SBT shell 选项卡?
- android - 使用 AAR 进行虚幻 Android 开发
- python - 递归中的python列表是否不会更改为其先前的值?
- java - 对于 400 Bad Request 没有得到正确的错误信息
- asp.net-core - 有没有办法要求 URL 路径段中存在次要版本?
- c++ - 字符串末尾的额外零字符出现在 C++ 中用于范围循环