ListNode类型空指针访问运行时错误的问题咨询与代码修复求助
错误原因与修复方案
错误含义
这个运行时错误的核心是空指针访问:你尝试对一个值为nullptr的指针(current_3)调用成员变量val,这属于C++中的未定义行为,会直接触发崩溃。
代码中的问题分析
current_3初始为空
你声明的l3是默认构造的ListNode,其next成员默认是nullptr,所以current_3 = l3.next;一开始就是空指针,进入循环后执行current_3->val = digit;必然报错。跳过了链表首节点
输入链表l1和l2的第一个节点就存储着数字,但你把current_1和current_2初始化为l1->next和l2->next,直接跳过了首节点,导致计算缺失开头的数值。未处理链表长度差异
你的循环仅在两个链表都有剩余节点时执行,若其中一个链表更长,剩余的节点没有被纳入计算。忽略了最终进位
当两个链表遍历完成后,如果carry不为0(例如999+999=1998,最后会剩余进位1),需要额外添加一个节点存储这个进位值。返回栈对象地址
l3是函数内的栈局部对象,函数执行结束后会被系统销毁,返回&l3相当于返回一个无效的野指针,后续使用该指针会导致未知错误。
修复后的代码
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { int carry = 0; // 用哑节点简化链表操作,避免处理头节点为空的情况 ListNode dummy; ListNode* current_3 = &dummy; // 直接从链表首节点开始遍历,同时处理链表长度不同和进位的情况 while (l1 != nullptr || l2 != nullptr || carry != 0) { int sum = carry; if (l1 != nullptr) { sum += l1->val; l1 = l1->next; } if (l2 != nullptr) { sum += l2->val; l2 = l2->next; } carry = sum / 10; // 新建节点存储当前位的数字 current_3->next = new ListNode(sum % 10); current_3 = current_3->next; } // 返回哑节点的next,即结果链表的首节点 return dummy.next; } };
修复说明
- 使用哑节点(dummy node):避免处理结果链表头节点为空的复杂情况,简化代码逻辑。
- 循环条件覆盖所有情况:只要任一链表还有节点,或者还有进位未处理,就继续循环。
- 动态创建节点:用
new在堆上创建结果节点,避免栈对象销毁导致的野指针问题。 - 正确遍历输入链表:从
l1和l2的首节点开始遍历,不跳过任何数值。
内容的提问来源于stack exchange,提问作者Ece Akdeniz
相关产品推荐
相关产品推荐

