我在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