如何在不导致分段错误的情况下更新 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));
。
我在 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));
。