B树C语言实现指定代码段报0xC0000005错误,是什么原因?
问题原因分析
你触发0xC0000005内存访问错误的核心原因有以下几点:
- 空指针解引用(直接触发报错的原因)
代码中BTree* y = nullptr;定义的y本身是二级指针,初始值为nullptr,当执行到*y = getBTNode(m);时,直接对空指针y做解引用操作,访问非法内存地址,直接触发访问违规。你删除最后创建根节点的代码段后,程序大概率在走到解引用y的逻辑前就提前返回,因此不会触发报错。 - 野指针与内存管理混乱
以下代码存在严重的内存操作错误:BTNode* tempNode = getBTNode(m+1); tempNode = (*x); // ...中间操作 delete tempNode;- 第一行刚通过
getBTNode分配了内存,第二行直接把tempNode指向了*x的地址,刚分配的内存地址丢失,造成内存泄漏。 - 你用
malloc分配的节点内存,最终用delete释放,属于未定义行为,C/C++中malloc必须和free配对使用,new才和delete配对。 - 释放tempNode等价于释放了
*x指向的内存,后续再访问*x的成员时,访问的是已经被释放的野地址,也会触发内存错误。
- 第一行刚通过
- 栈操作逻辑完全错误
你在遍历到叶子节点退出第一个while循环时,*x的值已经是nullptr。进入后续的栈循环后,你直接弹出栈顶元素,但完全没有把栈中存储的节点地址和下标赋值给x和i,导致后续操作的x始终指向空指针,访问(*x)->n等操作本质都是空指针解引用。 - 其他逻辑错误
binarySearch函数中循环条件写的是按位与&,不是逻辑与&&,且循环内判断key == K[i]的分支永远不可能触发(因为循环进入条件是key > K[i]),查找逻辑完全失效。- 插入键值时直接写
(*x)->K[i+1] = newKey,没有将插入位置后面的原有键值和指针后移,插入逻辑错误。
修复建议
- 把y的定义改为
BTree y = nullptr;,不需要用二级指针,修改所有涉及y的操作去掉一层解引用。 - 分裂节点时不要直接给tempNode赋值为
*x,而是把*x的所有元素拷贝到tempNode中再做插入操作,释放tempNode要用free。 - 弹出栈顶时,要把栈中存储的节点指针赋值给x,存储的下标赋值给i,再做后续插入判断。
- 修复binarySearch的逻辑,插入键值时要移动插入位置后的元素。
内容的提问来源于stack exchange,提问作者nononbb
相关产品推荐
相关产品推荐

