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

How can I update a character pointer in a bst struct without causing a segmentation fault?

我在 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)

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

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