【发布时间】:2014-03-14 09:32:51
【问题描述】:
我有一个具有这种结构的节点:
struct node
{
unsigned long key;
unsigned long value;
struct node* lChild;
struct node* rChild;
};
我有一个具有默认值的虚拟节点:
struct node* newSpecialNode()
{
struct node* node = (struct node*) malloc(sizeof(struct node));
node->key = 0;
node->value = 0;
node->lChild = NULL;
node->rChild = NULL;
return(node);
}
我的数据结构中的所有节点都会调用这个方法来创建一个节点。
struct node* newInternalNode(unsigned long key, unsigned long value)
{
struct node* node = (struct node*) malloc(sizeof(struct node));
node->key = key;
node->value = value;
node->lChild = newSpecialNode();
node->rChild = newSpecialNode();
return(node);
}
我为左右孩子调用函数newSpecialNode()。
所以有两个malloc 调用。但是每当我创建一个节点时,我总是会创建两个虚拟节点。
所以我想做一个为lChild 和rChild 分配内存的malloc。
可能分配一个双字并引用它的部分。但我不知道该怎么做。
我尝试了这种方法。但是我又需要做两个 malloc。
struct node** ptrToTwoNodes = (struct node**) malloc(2*sizeof(struct node*));
ptrToTwoNodes[0] = (struct node*) malloc(sizeof(struct node));
ptrToTwoNodes[1] = (struct node*) malloc(sizeof(struct node));
【问题讨论】:
-
struct node* ptrToTwoNodes = (struct node*) malloc(2*sizeof(struct node));,(ptrToTwoNodes),(ptrToTwoNodes+1) -
要考虑的重要一点是,如果您在单个
malloc()调用中分配多个节点,则需要将这些节点作为一个块释放。这可能意味着您必须跟踪哪个指针是要被释放的指针,并且只有在 all 指向它的指针不再使用时才释放该块。如果您需要能够独立释放lChild或rChild(或以其他方式将所有权转移给可能持有指向node的指针的其他事物),您应该坚持使用单独的malloc()调用。
标签: c memory-management malloc