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