我在C程序中遇到了一个函数问题。该计划的目的是:从二进制文件如何在二进制树中释放分配的内存C
- 读整数到一个数组
- 排序使用二叉树这些数字
- 做一些其他的东西
- 免费您在使用分配的所有内存的malloc();
我已经得到了一切工作,除了能够释放我的二叉树。这里是我的结构树和节点(又名叶)。
typedef struct Node *NodeP;
typedef struct Tree *TreeP;
// Definition of a tree
struct Tree
{
NodeP root;
}Tree;
// Definition of a node
struct Node
{
int data;
NodeP L, R;
}Node;
在我的程序中,我用malloc为我的树和每个单独的节点分配内存。所以我调用一个函数来释放树及其所有节点。
/*
* Frees the memory allocated for
* each node
*/
void freeNode(NodeP p)
{
if(p == NULL) return;
freeNode(p->L);
freeNode(p->R);
free(p);
}
/*
* Frees the memory allocated
* for the tree
*/
TreeP freeTree(TreeP tree)
{
if(tree->root == NULL)
free(tree);
else
{
freeNode(tree->root);
free(tree);
}
return NULL;
}
当我运行这个程序时,我的调试器给我这个错误。
EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
我已经尝试过精神上经历递归的每次迭代,我找不到为什么它给了我一个错误。我认为它在边缘情况下从树的边缘掉下来了?我不确定。任何帮助是极大的赞赏!
编辑:
这是一个链接,下载完整的程序。我包括一个自述文件和我正在使用的二进制文件。一个只有10个整数,另一个是20000个整数。感谢您一直以来的帮助!
https://copy.com/902v0bMv8DtIMUrc
为什么不看看调用堆栈来实现,问题出在哪里? (至少在什么级别) – ars 2015-02-24 20:02:25
我可以看到两个不同寻常的结构('freeNode'中的'p = NULL'和'freeTree'返回NULL],但这些都不应该是你问题的根源(但无论如何,我会摆脱它们)。我怀疑你已经把堆扔到了别的地方,而且只有当你走树解释节点时才会出现问题。在别处看看。 – user590028 2015-02-24 20:06:07
我看不出有什么明显的错误,所以你必须使用调试器和小树来找到问题。该树可能是畸形的,例如,多个父母指向同一个孩子,或者某些指针未正确初始化,但这些类型的问题不在您共享的代码中。注意:'freeNode'结尾的'p = NULL;'行什么都不做,应该被删除。 – user3386109 2015-02-24 20:09:13