gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:51:19 24 4
gpt4 key购买 nike

已修复:问题出在递归上,而不是指针上。当它通过每次递归返回时,它会将返回的 VAR 重置为旧的主树。通过制作全局 VAR 并在返回之前设置它然后使整个函数返回无效来修复。没有内存泄漏。

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

代码在一定程度上起作用。它没有将指针地址从 FinalTree 传回 main,而是创建了一个新副本,这意味着我无法释放()在 FinalTree()中分配的内存。当我进行内存检查时,我留下了一些未释放的内存。

这是目前的代码:

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);

指针快把我逼疯了。我错过了什么?

最佳答案

如果我没有完全理解您的问题,请原谅我,但根据评论,我想我知道您现在指的是什么。

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

类似(未测试):

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

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

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

void plant(Forest forest, Tree *&tree)

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

关于c - 从 C 中的函数返回指针地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14869083/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com