我正试着在C中解放一棵大树,每棵树可以有12个儿子。但是当我执行这段代码时,没有删除任何节点,我的计算机变得很慢,并且在2-3分钟后由于seg故障而结束
void freeTheNodes(node_t *n)
{
for (int i = 0; i < 13; ++i) {
if (n->children[i] != NULL) {
freeTheNodes(n->children[i]);
}
}
free(n);
}你知道为什么我的代码不能工作吗?
发布于 2016-12-16 19:55:02
您说每个节点可以有12个子节点,但您正在尝试删除13个子节点。这可能解释了您的一些问题。
也有可能是你的树一开始就损坏了--我们无法判断,因为你没有提供代码。
您的代码假定children不为空--确保这一点适用。
我很想把它写成:
void freeTheNodes(node_t *n)
{
if(n != NULL) {
for (int i = 0; i < CHILD_COUNT; ++i) {
freeTheNodes(n->children[i]);
}
free(n);
}
}..。只是因为它稍微简单一点(以递归更深一层为代价)。
在调试器中单步执行正在运行的代码,查看它是否执行了预期的操作,并检查实际变量的实际内容。
使用像electricfence这样的工具也是一个好主意,如果您的程序试图在分配的内存之外进行读/写操作,它会立即导致程序失败。我怀疑使用electricfence你的程序会很快出错,而不是在失败前运行几分钟。
发布于 2016-12-16 19:51:58
for (int i = 0; i < 13; ++i) 将免费提供13个节点。将其更改为
for (int i = 0; i < 12; ++i)https://stackoverflow.com/questions/41183711
复制相似问题