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

C语言AVL树实现调用getheight函数触发SIGSEGV段错误求助

解决AVL树getheight函数触发的段错误问题

核心原因

你碰到的SIGSEGV段错误,本质是访问了空指针(NULL)的成员变量——data < T->c这条语句里,T是NULL,程序试图读取空指针指向的内存,直接触发崩溃。

修复步骤

1. 给getheight函数加空指针判断

AVL树的空节点高度通常定义为-1(或者0,和你的实现逻辑统一就行),必须先判断节点是否为空,再访问成员:

int getheight(Node *T) {
    // 先处理空节点,避免踩空指针
    if (T == NULL) {
        return -1; // 若你的树初始高度定义为0,这里也返回0
    }
    // 执行原本的高度获取逻辑,比如返回节点存储的height值
    return T->height;
}

2. 检查节点内存分配是否正确

构建普通二叉树时看似正常,大概率是你创建新节点时没通过malloc在堆上分配内存,导致节点指针是野指针或NULL:

// 正确的节点创建方式
Node* createNode(int data) {
    Node *newNode = (Node*)malloc(sizeof(Node));
    if (newNode == NULL) {
        perror("内存分配失败");
        exit(EXIT_FAILURE);
    }
    newNode->c = data; // 对应你代码里的节点成员c
    newNode->left = NULL;
    newNode->right = NULL;
    newNode->height = 0; // 新节点初始高度设为0
    return newNode;
}

要是你创建节点时用的是栈上局部变量(比如Node newNode;然后返回&newNode),函数结束后栈内存会被释放,后续访问就会出现野指针问题,必须用malloc分配堆内存。

3. 排查getheight的调用场景

确认调用getheight的地方,传入的节点是否可能为NULL。比如计算平衡因子时,左右子树可能为空,必须保证空节点能被getheight正确处理:

int getBalanceFactor(Node *T) {
    if (T == NULL) {
        return 0;
    }
    // 左右子树可能为空,所以getheight必须能处理空指针
    return getheight(T->left) - getheight(T->right);
}

验证方法

修复后,单步调试插入节点的过程,检查每个新节点的内存地址是否有效(不是NULL或野指针),再跟踪getheight的调用参数,确认不会出现未处理的空指针。

内容的提问来源于stack exchange,提问作者pioneer-ground

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 18:35:27