C++ 为什么我的代码会导致运行时错误?

C++ 为什么我的代码会导致运行时错误?,c++,pointers,runtime-error,C++,Pointers,Runtime Error,我得到两个链表,代表两个非负数。数字按相反顺序存储,每个节点包含一个数字。我必须编写一个代码,将这两个数字相加,并将其作为链表返回(顺序也是相反的) 我已经编写了以下代码。只要最后一个数字不是9,它就可以正常工作。看起来这是一个内存分配问题,但我不知道是什么 有人能提出什么问题以及如何解决吗 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; *

我得到两个链表,代表两个非负数。数字按相反顺序存储,每个节点包含一个数字。我必须编写一个代码,将这两个数字相加,并将其作为链表返回(顺序也是相反的)

我已经编写了以下代码。只要最后一个数字不是9,它就可以正常工作。看起来这是一个内存分配问题,但我不知道是什么

有人能提出什么问题以及如何解决吗

/**
* Definition for singly-linked list.
* struct ListNode {
*     int val;
*     ListNode *next;
*     ListNode(int x) : val(x), next(NULL) {}
* };
*/

void adder(int &value, bool &carry) {
   if(carry) value++;
   if (value > 9) {
      value = value%10;
      carry = true;
   }else carry = false;
}

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode* prev = NULL;
        bool carry = false;
        ListNode* curr1 = l1;
        ListNode* curr2 = l2;
        ListNode* worker = NULL;

        while(curr1 != NULL && curr2 != NULL){
            curr1 = curr1->next;
            curr2 = curr2->next;
        }

        if(curr1 != NULL) worker = l1;
        else worker = l2;

        ListNode* result = worker;
        curr1 = l1;
        curr2 = l2;

        while(curr1 != NULL && curr2 != NULL) {
            int value = curr1->val + curr2->val ;
            adder(value, carry);
            worker->val = value;
            //cout<<curr1->val<<endl;
            curr1 = curr1->next;
            curr2 = curr2->next;
            prev = worker ;
            worker = worker->next;
        }

        while(worker != NULL && carry) {
            int value = worker->val;
            adder(value, carry);
            worker->val = value;
            prev = worker;
            worker = worker->next;
        }

        ListNode last(1);

        //the following line results in runtime error
        if(carry) {
            prev->next = &last;
        }

        return result; 

    }
};
/**
*单链表的定义。
*结构列表节点{
*int-val;
*ListNode*下一步;
*ListNode(intx):val(x),next(NULL){}
* };
*/
无效加法器(整数和值、布尔和进位){
if(进位)值++;
如果(值>9){
值=值%10;
进位=真;
}else=false;
}
类解决方案{
公众:
ListNode*AddTwoNumber(ListNode*l1,ListNode*l2){
ListNode*prev=NULL;
布尔进位=假;
ListNode*curr1=l1;
ListNode*curr2=l2;
ListNode*worker=NULL;
while(curr1!=NULL&&curr2!=NULL){
curr1=curr1->next;
curr2=curr2->next;
}
如果(curr1!=NULL)worker=l1;
else-worker=l2;
ListNode*结果=工作者;
curr1=l1;
curr2=l2;
while(curr1!=NULL&&curr2!=NULL){
int value=curr1->val+curr2->val;
加法器(值,进位);
工人->价值=价值;
//coutnext;
}
while(worker!=NULL&&carry){
int value=worker->val;
加法器(值,进位);
工人->价值=价值;
prev=工人;
工人=工人->下一步;
}
listnodelast(1);
//以下行导致运行时错误
如果(携带){
上一个->下一个=&last;
}
返回结果;
}
};

您至少有两个明显的错误首先,至少据我所知,不能保证在

prev->next = &last;
是非空的。这是算法逻辑中的错误Second,您正在将本地对象
last
添加到链接列表中。相反,您应该使用
new
分配一个新的
ListNode
,例如:

assert(prev);       // must not be NULL
prev->next = new ListNode(1);

解决这个问题的合适工具是调试器。最后,您可以确定哪一行导致错误获取局部变量的地址会导致灾难(&last)。在声明的范围之外,它将是无效的。您真的认为添加一个指向局部变量的指针是一个好主意吗?当子例程退出到链表的末尾时,该局部变量将消失?@UnholySheep这是我的TM:p当
addTwoNumber()
退出时,最后的内存不再有效。但是,它是列表中的指针。不能使用指向局部变量的指针。