我正在尝试在c中实现二进制搜索树。我使用lldb来跟踪我的代码,我发现当函数PUT返回时,它返回一个带有key = 5和value = 9的节点指针,并将它分配给main中的节点指针P.
然而,当我将它传递给tree_walk函数并尝试打印出所有内容时,它给了我一个分段错误。任何人都可以告诉我的代码有什么问题。谢谢
typedef struct Node{
int key;
int value;
int size;
struct Node *left;
struct Node *right;
}Node;
Node* put(Node **node, int k, int val){
if(*node == NULL){
Node *newNode = (Node *)malloc(sizeof(Node*));
newNode->key = k;
newNode->value = val;
return newNode;
}else if((*node)-> key == k){
(*node)->value = val;
}else{
int cmp = k > ((*node)->key) ? 1 : 0;
Node **ptr = NULL;
if(cmp == 1){
ptr = &((*node)->right);
(*node)->right = put(ptr, k, val);
}else{
ptr = &((*node)->left);
(*node)->left = put(ptr, k ,val);
}
}
(*node)->size = size((*node)->left) + size((*node)->right) + 1;
return *node;
}
int main(void){
Node *p = NULL;
p = put(&p, 5,9);
tree_walk(p);
}
答案 0 :(得分:3)
此行分配错误的大小:
Node *newNode = (Node *)malloc(sizeof(Node*));
应该是:
Node *newNode = malloc( sizeof *newNode );
您只为指针分配了足够的空间,而不是Node
。
另一个问题是,您永远不会初始化newNode->left
和newNode->right
。如果tree_walk
函数尝试读取它们,则会导致未定义的行为。