You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

B树C语言实现指定代码段报0xC0000005错误,是什么原因?

问题原因分析

你触发0xC0000005内存访问错误的核心原因有以下几点:

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

内容的提问来源于stack exchange,提问作者nononbb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 16:15:07