链接列表中的运行时错误:“ListNode”类型的空指针内的成员访问

Posted

技术标签:

【中文标题】链接列表中的运行时错误:“ListNode”类型的空指针内的成员访问【英文标题】:Runtime error in Linked List :member access within null pointer of type 'ListNode' 【发布时间】:2021-01-13 03:22:38 【问题描述】:

我得到了两个非空链表,代表两个非负整数,我试图将这两个数字相加并将总和作为链表返回。 我收到一个错误提示

字符 18:运行时错误:“ListNode”类型的空指针内的成员访问 (solution.cpp) 总结:UndefinedBehaviorSanitizer:未定义行为

为什么我会得到这个数组,我该如何解决这个问题?

class Solution 
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) 
        int carry=0,sum = 0;
        ListNode* res = new ListNode(0);
        while(l1->next !=NULL)
            sum = carry + l1->val + l2->val;
            if(sum>9)
                carry = 1;
            else
                carry = 0;
            
            res = res->next;
            
            res->val = sum;
        
        return res;
        
    
;

错误显示在 Line with code 中

         res->val = sum;

【问题讨论】:

小测验:什么是“ListNode* res = new ListNode(0);”? res->next; 会在这里做什么?当res=res->next; 时,您期望会发生什么?你试过explaining every line of your program to your rubber duck吗? 另外请尝试向你的橡皮鸭解释循环while(l1->next !=NULL),并告诉它你在哪里修改l1 【参考方案1】:

首先,这段代码有很多错误,你没有更新 l2 的值,所以最终你试图将 l1 的所有值与 l2 的 head->节点相加,这是荒谬的。

至于错误,它的发生是因为您正在创建一个新节点 ListNode* res = new ListNode(0); 所以根据这个创建了一个名为 res 的新节点,res->next 将包含 NULL,这是我根据构造函数猜测的呼叫您的ListNode 课程。

所以 w.r.t 上面的语句 res = res->next; 现在 res 指向 NULL。 进一步 res->val = sum; 您正在尝试访问 null 内的值,从而给您运行时错误,因为您正在尝试访问未分配的内容。

我建议您首先尝试简单的问题“将 1 添加到给定的链表”。 因为当你将 1 加到 999 时它也可以产生进位,结果链表应该是 1000。 它将让您更好地了解如何解决此类问题。

【讨论】:

以上是关于链接列表中的运行时错误:“ListNode”类型的空指针内的成员访问的主要内容,如果未能解决你的问题,请参考以下文章

“从链接列表中删除循环”中的运行时错误

java 链接列表迭代ListNode

max(.) 中的错误:使用 dplyr dbplyr 和 bigrquery 时参数的“类型”(列表)无效

LeetCode 24. 两两交换链表中的节点

原始链接列表在Java中反向链接列表时被修改

MS Access 运行时错误 3999