首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何释放我的树中的所有节点?

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

Stack Overflow用户
提问于 2016-12-16 19:47:07
回答 2查看 73关注 0票数 0

我正试着在C中解放一棵大树,每棵树可以有12个儿子。但是当我执行这段代码时,没有删除任何节点,我的计算机变得很慢,并且在2-3分钟后由于seg故障而结束

代码语言:javascript
复制
void freeTheNodes(node_t *n)
{
    for (int i = 0; i < 13; ++i) {
        if (n->children[i] != NULL) {
            freeTheNodes(n->children[i]);
        }
    }
    free(n);
}

你知道为什么我的代码不能工作吗?

EN

回答 2

Stack Overflow用户

发布于 2016-12-16 19:55:02

您说每个节点可以有12个子节点,但您正在尝试删除13个子节点。这可能解释了您的一些问题。

也有可能是你的树一开始就损坏了--我们无法判断,因为你没有提供代码。

您的代码假定children不为空--确保这一点适用。

我很想把它写成:

代码语言:javascript
复制
void freeTheNodes(node_t *n)
{
    if(n != NULL) {
       for (int i = 0; i < CHILD_COUNT; ++i) {
          freeTheNodes(n->children[i]);
       }
       free(n);
    }
}

..。只是因为它稍微简单一点(以递归更深一层为代价)。

在调试器中单步执行正在运行的代码,查看它是否执行了预期的操作,并检查实际变量的实际内容。

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

票数 4
EN

Stack Overflow用户

发布于 2016-12-16 19:51:58

代码语言:javascript
复制
for (int i = 0; i < 13; ++i) 

将免费提供13个节点。将其更改为

代码语言:javascript
复制
for (int i = 0; i < 12; ++i)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41183711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档