作业,在 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 中的结构内分配指针的主要内容,如果未能解决你的问题,请参考以下文章

如何在c中的结构内为结构数组赋值?

C中的结构和指针(将字符串分配给结构)

在结构内分配双指针结构?

在 Python/ctypes 中的结构内取消引用 C 函数指针

结构内分配内存的 C++ 使用情况

为具有双指针的结构内的动态结构数组分配内存**