修正済み: 問題はポインタではなく再帰にありました。各再帰を介して戻ると、返された VAR が古いメインツリーにリセットされます。グローバル VAR を作成し、それを return の前に設定してから、関数全体を void に戻すことで修正しました。メモリリークはありません。
main() のポインタ変数に malloc されたポインタ アドレスを渡そうとしています。
コードはある程度まで機能します。FinalTree から main にポインタ アドレスを渡す代わりに、FinalTree() で malloc されたメモリを free() できないことを意味する新しいコピーを作成します。メモリ チェックを行うと、解放されていないメモリが残ります。
これまでのコードは次のとおりです。
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);
ポインターは私を夢中にさせています..何が欠けていますか?