二叉树销毁代码失效问题排查及修正方法咨询
二叉树销毁函数的错误分析与修正
核心错误点
你写的销毁函数逻辑本身是正确的(后序遍历先销毁左右子树,再释放当前节点),问题出在调用时的传参错误:
BinaryTreeDestory(&*root)这行代码里,&*root等价于root,本质是把BTNode*类型的指针值传给了要求BTNode**类型参数的函数。- 这会导致两个问题:一是编译器会触发类型不匹配的警告;二是函数内部的
*root = NULL只会修改函数参数的临时拷贝,main里的root变量仍然保留原来的堆地址,变成野指针。
修正方法
把main里的调用代码改成:
BinaryTreeDestory(&root);
这里传递的是main中root变量的地址(BTNode**类型),这样销毁函数就能正确地在释放内存后,把main里的root置为NULL,彻底避免野指针问题。
修正后的完整main函数
int main() { BTDataType a[] = "ABD##E#H##CF##G##"; int i = 0; BTNode* root = BinaryTreeCreate(a, &i); BinaryTreeDestory(&root); }
内容的提问来源于stack exchange,提问作者yuzhiU
相关产品推荐
相关产品推荐

