gpt4 book ai didi

c - 插入二叉树时出现段错误

转载 作者:行者123 更新时间:2023-11-30 15:23:47 25 4
gpt4 key购买 nike

我不知道如何正确运行它,给出了段错误。下面是一段代码。你也可以看一下 head 吗,我不确定在另一个文件中将 head 初始化为 null 是否是正确的方法,它的运行如下:

Table tb ;
tb= initialise_table (table_size);
tb = insert(text_words,tb);

//these 3 typedef declarations are in a "some.h" file
typedef struct node * tree_ptr;
typedef char* Key_Type;
typedef struct table* Table;
struct node {
Key_Type element;
tree_ptr left;
tree_ptr right;
};

struct table {
tree_ptr head;
};

Table init_table() {

Table head = NULL;

}
Table insert(Key_Type key ,Table temp ) {
tree_ptr t = (tree_ptr)malloc(sizeof(tree_ptr));
t->element = key;
// t->left = t->right = NULL;
if (temp->head==NULL) {
temp = (Table)malloc (sizeof (Table));
temp->head = t;
printf("empty tree ");
}
else {
temp = insert(t->element,temp);
printf("inserted into ");
}

return temp;
printf("wowo!");
}

最佳答案

主要问题在于您所说的用于调用函数的代码:

Table tb;

tb = insert(text_words, tb);

您有一个未初始化的指针tb,您将其传递给函数。在函数内部,您有:

Table insert(Key_Type key, Table temp)
{
tree_ptr t = (tree_ptr)malloc(sizeof(*t)); // Fixed size
t->element = key;
// t->left = t->right = NULL;
if (temp->head==NULL)
{

因此,您正在访问(取消引用)未定义的指针,并且您的程序正在崩溃。

我认为,您应该使用 table_init() 初始化您的表,但该函数实际上没有任何帮助。它定义并初始化一个局部变量,但不返回任何内容,即使它 promise 这样做。

请参阅Is it a good idea to typedef pointers?简短的回答是“不,这通常不是一个好主意”。

即使您像这样修复调用代码(必要但不充分的步骤),您仍然会遇到问题:

Table tb = NULL;
tb = insert(text_words, tb);

或者也许:

Table tb = init_table();
tb = insert(text_words, tb);

但是你需要一个init_table()的严重升级版本,例如:

Table init_table(void)
{
Table root = malloc(sizeof(*head));
root->head = NULL;
return root;
}

insert() 中的代码需要确保它不会取消引用空指针(而不是不确定的指针)。

Table insert(Key_Type key, Table root)
{
tree_ptr t = (tree_ptr)malloc(sizeof(*t)); // Fixed size
t->element = key;
t->left = t->right = NULL;
if (root == NULL)
{
root = init_table();
root->head = t;
}
else
{

}
return root;
}

鉴于 Key_Type 是变相的 char *,您可能需要检查如何在树结构中保存键;您可能需要使用 strdup() 来复制数据。如果不了解如何管理传递给 insert() 函数的字符串,就不可能确定。如果调用代码确保每次都传递一个新指针,那么只保存指针就可以了。 OTOH,如果每次传递相同的指针,您肯定需要复制数据,而使用 strdup() 是一种明智的方法。请注意,strdup() 是 POSIX 上的标准;它不是标准 C 的一部分。

关于c - 插入二叉树时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28648844/

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