从C中的函数返回指针地址

时间:2013-02-14 06:36:31

标签: c pointers

FIXED:问题在于递归而不是指针。当它通过每次递归返回时,它会将返回的VAR重置为旧的maintree。通过创建全局VAR并在返回之前设置它然后使整个函数返回void来修复。没有内存泄漏。

我正在尝试将malloc指针地址传递给main()中的指针变量。

代码可以解决问题。它不是将指针地址从FinalTree传递回main,而是创建一个新副本,这意味着我无法释放()在FinalTree()中使用malloc的内存。当我进行内存检查时,我留下了一些未释放的内存。

以下是目前的代码:

Tree* FinalTree(Forest** forest, int FinalFreq)
{

    Tree* maintree = mktree(); //this function calls malloc and have to use it
    Tree* tree1 = pick(*forest);
    Tree* tree2 = pick(*forest);

    maintree->frequency = tree1->frequency + tree2->frequency;
    maintree->left = tree1;
    maintree->right = tree2;

    //Make sure forest isnt barren
    if (maintree->frequency != FinalFreq)
    {
        plant(*forest, maintree);
        FinalTree(forest, FinalFreq);
    }

    return maintree;
}

这是从main()调用的:

Tree* tfinal = FinalTree(&finit, header.checksum);

指针让我疯了......我错过了什么?

1 个答案:

答案 0 :(得分:0)

如果我完全不理解你的问题,请原谅我,但根据评论,我认为我知道你现在指的是什么。

该函数创建树,但只返回顶级根节点的地址。你的问题是如果你free()那个,树的其余部分仍然分配,对吗?如果是这样,我认为解决这个问题的方法是编写一个专用的FreeTree(Tree *)函数,该函数遍历树,free()是备份路径上的各个叶节点。

像(未经测试)的东西:

void FreeTree(Tree *tree) {
  if (tree == NULL)
    return;

  FreeTree(tree->left);
  FreeTree(tree->right);
  free(tree);                                                                                                            
}

更新:好的。这确实很奇怪。我没有在函数中看到任何会改变创建它的maintree之外的mktree()。除非plant引用指针:

void plant(Forest forest, Tree *&tree)

然后plant()可以修改指向maintree的指针。否则它看起来应该返回根节点。