Исправлено: Проблема была с рекурсией, а не указателями. Когда он вернется через каждую рекурсию, он вернет возвращаемый VAR к старой maintree. Исправлено, создав глобальный VAR и установив его перед возвратом, а затем выполнил полную функцию return void. Нет утечек памяти.Возврат адреса указателя из функции в C
Я пытаюсь передать адрес указателя malloc'd в переменную-указатель в main().
Код работает до определенной точки. Вместо того, чтобы передавать адрес указателя из FinalTree на главную, он создает новую копию, что означает, что я не могу освободить() память, которая была malloc'd в 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;
}
Это вызывается из основной() путем:
Tree* tfinal = FinalTree(&finit, header.checksum);
Указатели вождения меня с ума .. Что мне не хватает?
Что делает «завод»? – junix
В основном это просто добавляет узел обратно в список. Проект состоит в том, чтобы «распаковать» файл, созданный деревом Хаффмана. Это просто восстановление дерева из сжатого файла. Свободная функция для леса очищает ВСЕ узлы в лесу. Valgrind говорит, что только 1 блок не освобождается, и я проследил его до возвращаемого maintree var. – Dyonovan
Я не совсем уверен, что я следую. Мне кажется, что проблема заключается в рекурсивном вызове 'FinalTree', чей адрес возврата, который вы нигде не сохраняете, и, следовательно, не может' free() ', это правильно? –