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
相关产品推荐
相关产品推荐

