gpt4 book ai didi

c - Unload() 递归 C Segfault(类似 TRIE 的数据库) CS50 pset5

转载 作者:行者123 更新时间:2023-11-30 21:07:37 26 4
gpt4 key购买 nike

编辑 1
正如 Jonathan Leffler 建议的我现在不使用以下划线开头的名称,并且还删除了 -> 周围的空格.
________________________________________________________________________________

尝试使用递归函数释放结构时出现段错误。

这是我的结构:

//creating new trie data ctructure
typedef struct dict
{
bool is_word;
struct dict *children[ALPHABET+1];
}
node;

它用于存储字典,用于拼写检查器。在程序结束时,我需要释放所有分配的内存。

这是我编写的函数。它应该调用自身并逐个释放 trie。然而,在多次调用自身后,它给了我段错误。

 bool unload(void)
{
// Check if root
if (temp == root)
{
for (int i = 0; i < ALPHABET+1; i++)
{
if (!temp->children[i] && i != ALPHABET)
{

}
else if (!temp->children[i] && i == ALPHABET)
{
free(temp);
return true;
}
else if(temp->children[i])
{
temp = temp->children[i];
unload();
}
}
}
else
{
for (int i = 0; i < ALPHABET+1; i++)
{
if (!temp->children[i] && i != ALPHABET)
{

}
else if (!temp->children[i] && i == ALPHABET)
{
temp1 = temp;
temp->children[i] = temp;
free(temp1);
return true;
}
else if (temp->children[i])
{
temp = temp->children[i];
unload();
}
}
}
return false;
}

假设 root 、 temp 、 temp1 是全局的。它们都是 struct _dict 的。当第一次调用该函数时 temp == root。

最佳答案

您的代码正在演示为什么全局变量是一个坏主意,并且会适得其反。您应该将要释放的节点传递给该函数;初始调用传递根节点。该函数不需要访问任何全局变量。

另请注意,点 . 和箭头 -> 运算符绑定(bind)得非常紧密,不应在其周围写入任何空格。此外,以下划线开头的名称基本上保留供实现使用。 The full details are more nuanced比这个多,但也不是很多。最简单的方法是避免在您发明的名称中使用前导下划线。仅使用它们来访问系统提供的设施。

此代码执行必要的操作,假设分配节点的代码确保所有指针均为空。

#include <stdlib.h>
#include <stdbool.h>
enum { ALPHABET = 26 };
typedef struct dict
{
bool is_word;
struct dict *children[ALPHABET+1];
} node;

void unload(node *item);

void unload(node *item)
{
for (int i = 0; i < ALPHABET+1; i++)
{
if (item->children[i] != 0)
unload(item->children[i]);
}
free(item);
}

可以修改代码以在使用之前测试 item 是否为 NULL。循环中的条件并不是严格必要的,但如果在分配任何节点之前调用它,则整体函数更具弹性。

如图所示,它可以使用这些相当严格的警告选项进行干净的编译(运行 macOS Sierra 10.12.3 的 Mac 上的 GCC 6.3.0):

$ gcc -O3 -g -std=c11 -Wall -Wextra -Werror -Wmissing-prototypes \
> -Wstrict-prototypes -Wold-style-definition -c tr47.c
$

该代码尚未运行。我已经为其他人针对这个 CS50 问题的变体编写了类似的函数。它不需要比这更复杂。

关于c - Unload() 递归 C Segfault(类似 TRIE 的数据库) CS50 pset5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42773542/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com