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

计算森林叶子结点数量时遍历抛出读取访问冲突异常如何解决

问题根因

触发读取访问冲突的核心问题有两个:

  1. main函数提前为根节点预分配了多余内存:CreateTree函数本身会根据输入动态创建节点,提前分配的内存不仅会在输入第一个有效节点时产生内存泄漏;如果第一个输入为-1(代表无对应节点),还会导致后续遍历访问到data字段未初始化的无效节点。
  2. CreateTree未处理输入为-1的分支逻辑:当输入为-1时,代表当前位置没有节点,必须显式把传入的二重指针指向的节点指针设为NULL,否则如果传入的指针原本就是非NULL的野指针/无效指针,后续遍历访问节点成员时就会触发访问冲突。
修复方案

1. 修改main函数

去掉多余的根节点预分配逻辑,直接初始化树指针为NULL即可:

#include "AllFun.h"
int main(int argc, char* argv[])
{
    CsNode* tree = NULL;
    CreateTree(&tree);
    if (tree != NULL) {
        preOrder(tree);
        int leaves = CountForestLeaves(tree);
        printf("\nleaves: %d", leaves);
    }
    return 0;
}

2. 修改CreateTree函数

补充输入为-1时的指针赋值逻辑,避免野指针:

void CreateTree(CsNode** node)
{
    int data;
    printf("please input data: ");
    scanf_s("%d", &data);
    if (data != -1) {
        *node = (CsNode*)malloc(sizeof(CsNode));
        // 建议补充malloc判空逻辑,避免分配失败触发访问冲突
        (*node)->data = data;
        (*node)->firstchild = NULL;
        (*node)->nextsibling = NULL;
        CreateTree(&(*node)->firstchild);
        CreateTree(&(*node)->nextsibling);
    } else {
        *node = NULL;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:06:00