【发布时间】:2021-08-23 22:43:24
【问题描述】:
我正在尝试创建一个二叉搜索树。这是我的节点初始化函数:
node_t* node_init(int val){
node_t* n1 = malloc(sizeof(node_t));
n1->value = val;
n1->leftNode = NULL;
n1->rightNode = NULL;
return n1;
}
由于我正在分配内存,我知道我应该在其他地方释放它。我在我的主要方法中这样做:
int main(){
tree_t t1;
tree_init(&t1);
node_t* n1 = node_init(5);
node_t* n2 = node_init(7);
t1.count += add(n1, &(t1.root));
t1.count += add(n2, &(t1.root));
//free(n1);
//free(n2);
print_tree(t1.root);
}
然而,当我取消注释释放行时,我得到一个分段错误错误。我不确定为什么会这样,因为一旦分配了内存,我就必须释放它。我没有在我的add 函数中进行任何释放,并且代码打印出一个没有free 语句的有效二叉搜索树。
如果有帮助,这是我的添加功能:
int add(node_t* n, node_t** tn){
if(*tn == NULL){*tn = n; return 1;}
if(n->value < (*tn)->value){add(n, &((*tn)->leftNode));}
else if (n->value > (*tn)->value){add(n, &((*tn)->rightNode));}
else{return 0;}
}
【问题讨论】:
-
如果可能,请提供minimal reproducible example。
-
释放节点后,您可能无法再次访问它们。认为
print_tree会尝试访问树中的节点似乎是合理的,因此在调用该函数之前不能释放它们。 -
通常,通过遍历树来找到它们,而不是通过保留和使用指向它们的单独指针来释放树中的所有节点。任何一种方式都可以,但后者需要维护额外的数据结构。
标签: c segmentation-fault malloc binary-search-tree free