gpt4 book ai didi

c - 如何在不导致段错误的情况下更新 bst 结构中的字符指针?

转载 作者:太空宇宙 更新时间:2023-11-04 08:22:29 24 4
gpt4 key购买 nike

在 Joel 在评论中提出建议后,我进行了一些更新,但仍然出现段错误。我的代码基本上是这样的:

typedef struct node {
struct node* left;
struct node* right;
char *key;
char *value;
unsigned long hash;
} node;
...
void update_node(node* tree, char *key,char *value) {

unsigned long h = hash(key);
if( tree->hash == h)
tree->value = value;
if( h < tree->hash && tree->left)
update_node( tree->left, key, value );
if( h > tree->hash && tree->right)
update_node( tree->right, key, value );
if( tree == NULL)
return;
}

但是当我尝试更新它时会导致段错误。我尝试过研究,但大多数情况下我发现结构段错误问题与指针的误用有关。例如,这很好用:

node *n = new_node("key","value");
n->value = "value2";

它只是更新一棵实际树上的值,这是行不通的。有没有办法正确地做到这一点?我做错了什么?

最佳答案

您需要在函数的开头检查树是否为 NULL

void update_node(node* tree, char *key,char *value) {

if( tree == NULL)
return;

unsigned long h = hash(key);
if( tree->hash == h)
tree->value = value;
if( h < tree->hash && tree->left)
update_node( tree->left, key, value );
if( h > tree->hash && tree->right)
update_node( tree->right, key, value );
}

尝试访问其成员之前不进行此检查可能会导致段错误。

编辑:

当您创建要添加到树中的节点时,请确保将所有值归零。如果您不将整个节点归零,它将包含垃圾值。

因此,像这样的检查......

if (tree -> left)

将返回 true,即使它不应该返回,因为它包含一个非零垃圾值。

尝试在创建节点时使用 memset(&m, 0, sizeof(myNode));

关于c - 如何在不导致段错误的情况下更新 bst 结构中的字符指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32834177/

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