C++调用ListNode的append方法段错误,this指针为0x0是什么原因?
问题根因分析
- 段错误直接原因:第一次调用
sum_ptr->append(temp_sum)时,因为初始sum对象的val值为INT_MIN,append方法仅修改了当前节点的val值,没有为当前节点的next指针分配任何对象,next保持初始化时的空值。执行sum_ptr = sum_ptr->next后,sum_ptr直接变成nullptr,下一次循环再调用sum_ptr->append时,就会出现this指针为0x0的段错误。 - 附带逻辑错误:进位计算顺序错误,你先执行了
temp_sum = temp_sum >= 10 ? temp_sum - 10 : temp_sum;,之后再判断temp_sum >=10计算c_over,此时temp_sum已经被减过10,永远不可能大于等于10,进位值会一直为0,完全不符合两数相加的逻辑预期。
修复方案
你的append方法本身的实现逻辑就是从调用节点出发遍历到链表尾部追加新节点,不需要移动头指针,直接删除错误的sum_ptr移动逻辑即可解决段错误,同时调整进位计算顺序,补充剩余节点和最终进位的处理:
ListNode sum; // sum_ptr固定指向头节点即可,不需要移动 ListNode* sum_ptr = ∑ const ListNode* l1_ptr = &l1; const ListNode* l2_ptr = &l2; int c_over = 0; while(l1_ptr != nullptr && l2_ptr != nullptr){ int temp_sum = l1_ptr->val + l2_ptr->val + c_over; // 先计算进位,再处理当前位数值 c_over = temp_sum >= 10 ? 1 : 0; temp_sum = temp_sum >= 10 ? temp_sum - 10 : temp_sum; sum_ptr->append(temp_sum); // 删掉错误的sum_ptr移动逻辑 // sum_ptr = sum_ptr->next; l1_ptr = l1_ptr->next; l2_ptr = l2_ptr->next; } // 补充l1剩余节点处理 while(l1_ptr != nullptr){ int temp_sum = l1_ptr->val + c_over; c_over = temp_sum >= 10 ? 1 : 0; temp_sum -= 10 * c_over; sum_ptr->append(temp_sum); l1_ptr = l1_ptr->next; } // 补充l2剩余节点处理 while(l2_ptr != nullptr){ int temp_sum = l2_ptr->val + c_over; c_over = temp_sum >= 10 ? 1 : 0; temp_sum -= 10 * c_over; sum_ptr->append(temp_sum); l2_ptr = l2_ptr->next; } // 补充最终进位处理 if(c_over > 0){ sum_ptr->append(1); }
内容的提问来源于stack exchange,提问作者ianwt
相关产品推荐
相关产品推荐

