C++有序链表插入节点出现段错误 调整while条件顺序后消失原因求解
有序链表插入代码段错误原因解析
核心成因:C++ && 运算符的短路求值特性
C++ 中逻辑与运算符&&遵循严格的短路求值规则:
- 对于表达式
条件A && 条件B,程序会优先计算条件A的布尔值 - 若
条件A的结果为false,整个表达式的结果已经确定为false,程序会直接跳过条件B的计算,不会执行条件B对应的代码
原代码条件的问题
你最初写的while判断逻辑为:
while (curr->next->data < data && curr->next != NULL)
当遍历到链表最后一个节点时,curr->next的值为NULL,此时程序会先执行curr->next->data < data的判断:
这一步需要对curr->next这个空指针进行解引用、访问成员data,属于非法内存访问,直接触发段错误。
调整顺序后的正确性
调整后的判断逻辑为:
while (curr->next != NULL && curr->next->data < data)
此时程序会先判断curr->next != NULL:
如果curr->next是NULL,那么第一个条件结果为false,&&触发短路,直接跳过后面的curr->next->data < data计算,不会出现空指针解引用的问题,段错误自然消失。
补充注意项
你的代码中还有一处语法错误需要修正,否则编译阶段就会报错:
if (data < head->data){ temp->next = head // 此处缺少分号 return temp; }
需要修改为temp->next = head;即可正常编译运行。
内容的提问来源于stack exchange,提问作者Eklavya Shukla
相关产品推荐
相关产品推荐

