作业,在 C 中的结构内分配指针
Posted
技术标签:
【中文标题】作业,在 C 中的结构内分配指针【英文标题】:Homework, Assigning pointers within a struct in C 【发布时间】:2014-04-23 11:21:10 【问题描述】:我正在做一棵二叉树作为我作业的一部分。
这是给定的结构:
typedef struct TreeNode
int data;
struct TreeNode* left;
struct TreeNode* right;
我的 build_tree 函数是递归的,这是原型:
void build_tree(TreeNode** root, const int elements[], const int count);
作业旨在部分测试动态分配的内存。因此,当我尝试为结构内的一个指针赋值时,我的问题一直在发生。我见过类似的问题,但似乎从来都不是这个问题,但仍然涉及结构和指针。如果我误解了,对于重复的问题,我深表歉意。
build_tree 方法必须递归完成 这是我的代码,用于何时将元素插入到根的右侧:
if(elements[0] > (*root)->data)
TreeNode newnode = elements[0], NULL, NULL; //make a node to add
*((*root)->right) = newnode; //dereference the root.right pointer, and set to newnode (GIVES COMPILE ERROR HERE)
struct TreeNode **rightptrptr = malloc(sizeof((*root)->right)); //allocate a pointer to a pointer
*rightptrptr = (*root)->right; //dereference pointer to a pointer, assign to root.right pointer
build_tree(rightptrptr, new_elems, count - 1);
如果重要的话,根节点已经初始化为an integer, NULL, NULL。
我对指针的理解不是那么复杂,所以如果这段代码很可怕,请原谅我。
【问题讨论】:
您实际上并没有使用newnode = elements[0], NULL, NULL
分配内存。 newnode
对象在堆栈上,因此只要您所在的任何块离开范围,它就会被删除(在这种情况下是 if
语句)。清除树时需要使用malloc
,并正确使用free
。
【参考方案1】:
这里有很多问题,我会尽力指出:
TreeNode newnode = elements[0], NULL, NULL;
,这会在栈上分配struct,这意味着退出函数作用域时newnode(&newnode
)的地址将不再有效。
如果您需要通过动态分配节点来构建树,TreeNode newnode = elements[0], NULL, NULL
不是您想要的。这不是一个动态分配的对象,它在堆栈上,你可以用它做的唯一事情就是将内容复制到分配的节点。您需要始终根据您的情况分配TreeNode* node = calloc(sizeof(TreeNode))
((*root)->right) = newnode
,在这里您取消引用指针以将 newnode
分配给它。它可以工作,但前提是right
指向分配的内存,情况并非如此,因为您的根将其初始化为NULL
。您应该直接分配指针,例如root->right = calloc(sizeof(TreeNode))
struct TreeNode **rightptrptr = malloc(sizeof((*root)->right))
,在这里您分配了一个指向 TreeNode
的指针的指针,因为递归函数期望这样做,但您的方法是错误的。您应该将指针传递给现有子树,而不是无目的分配一个,您可以这样做,例如&root->right
。
【讨论】:
这些都说得通,也帮了大忙。谢谢!以上是关于作业,在 C 中的结构内分配指针的主要内容,如果未能解决你的问题,请参考以下文章