C 如何释放我树的所有节点?

C 如何释放我树的所有节点?,c,recursion,tree,C,Recursion,Tree,我正试图解放C的一棵大树。每棵树可以有12个儿子。但当我执行这段代码时,没有节点被删除,我的计算机速度变慢,并在seg故障2-3分钟后结束 void freeTheNodes(node_t *n) { for (int i = 0; i < 13; ++i) { if (n->children[i] != NULL) { freeTheNodes(n->children[i]); } } free(

我正试图解放C的一棵大树。每棵树可以有12个儿子。但当我执行这段代码时,没有节点被删除,我的计算机速度变慢,并在seg故障2-3分钟后结束

void freeTheNodes(node_t *n)
{
    for (int i = 0; i < 13; ++i) {
        if (n->children[i] != NULL) {
            freeTheNodes(n->children[i]);
        }
    }
    free(n);
}
void freeTheNodes(节点\u t*n)
{
对于(int i=0;i<13;++i){
如果(n->children[i]!=NULL){
自由节点(n->children[i]);
}
}
自由(n);
}
你知道为什么我的代码不起作用吗

for(int i=0;i<13;++i)
for (int i = 0; i < 13; ++i) 
将释放13个节点。换成

for (int i = 0; i < 12; ++i)
for(int i=0;i<12;++i)

您说每个节点可以有12个子节点,但您试图删除13个子节点。这可能是你的一些问题的原因

首先,您的树可能已损坏——我们无法判断,因为您尚未提供该代码

您的代码假定
子项
不为null——请确保这一点适用

我很想把它写成:

void freeTheNodes(node_t *n)
{
    if(n != NULL) {
       for (int i = 0; i < CHILD_COUNT; ++i) {
          freeTheNodes(n->children[i]);
       }
       free(n);
    }
}
void freeTheNodes(节点\u t*n)
{
如果(n!=NULL){
对于(int i=0;ichildren[i]);
}
自由(n);
}
}
。。。只是因为它稍微简单一点(代价是递归更深一层)

在调试器中逐步检查正在运行的代码,查看它是否符合预期,并检查实际变量的实际内容


最好也使用像
electricfence
这样的工具,如果程序试图在分配的内存之外读/写,它会立即导致程序失败。我怀疑使用
electricfence
你的程序会很快出错,而不是在失败前运行几分钟。

如果(n->children[I]!=NULL)freeTheNodes(n->children[I]),你为什么这样写?你的屏幕太小了吗?分段错误可能是由堆栈溢出引起的!您得到的确切错误消息是什么。你试过在valgrind或gdb中运行它吗?顺便说一下:你不需要检查你想要释放的指针是否为空
free(NULL)
是可以的,它实际上不会做任何事情。@MichaelWalz但在尝试读取
n->children
@MichaelWalt之前,您需要检查它是否为NULL,它是递归的
freeTheNodes()
freeTheNodes()
的调用者(一次除外),并且
n
的值每次都会更改(从
children
的元素中读取)。另外,请注意,
如果(n->children[i]!=NULL)
是未定义的行为,因此它可以解释观察到的“无法解释的”行为。