类型'struct structVarable'的空指针内的成员访问

时间:2018-12-01 05:49:17

标签: c linked-list singly-linked-list

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
    struct ListNode *temp1, *temp2, *temp3, *start;
    temp3 = (struct ListNode*)malloc(sizeof(struct ListNode));
    temp3->val = 0;
    temp3->next = NULL;

    if (!temp3)
        exit(0);

    temp1 = l1;
    temp2 = l2;
    int val, v1, v2, v3;

    while (temp1 != NULL && temp2 != NULL)
    {
        v1 = temp1->val;
        v2 = temp2->val;
        val = v1 + v2;

        if (val > 9)
        {
            (temp3->val) = (val - 10); //error here
            temp1 = temp1->next;

            (temp1->val) = ((temp1->val) + 1);
        }
        else
            (temp3->val) = val;

        if (start == NULL)
            start = temp3;

        temp3 = temp3->next;
        temp1 = temp1->next;
        temp2 = temp2->next;
    }

    while (temp1 != NULL)
    {
        (temp3->val) = (temp1->val);
        if (start == NULL)
            start = temp3;
        temp3 = temp3->next;
        temp1 = temp1->next;


    }

    while (temp2 != NULL)
    {
        (temp3->val) = (temp2->val);
        if (start == NULL)
            start = temp3;
        temp3 = temp3->next;
        temp2 = temp2->next;
    }

    return start;
}

此代码行有错误(行:31 (temp3->val)=(val-10);) 在为temp3temp3->val=0; temp3->next=NULL;)分配内存之后,我尝试添加这些代码行,但是没有用。

1 个答案:

答案 0 :(得分:1)

问题是您忘记在循环内为新列表(又名malloc / starttemp3个新元素。

这里:

temp3 = (struct ListNode*)malloc(sizeof(struct ListNode));

您分配一个 struct ListNode,但在此循环内例如:

while (temp1 != NULL && temp2 != NULL)
{
    v1 = temp1->val;
    v2 = temp2->val;
    val = v1 + v2;

    if (val > 9)
    {
        (temp3->val) = (val - 10); //error here
        temp1 = temp1->next;

        (temp1->val) = ((temp1->val) + 1);
    }
    else
        (temp3->val) = val;

    if (start == NULL)
        start = temp3;

    temp3 = temp3->next;   // temp3 will become NULL in first iteration
    temp1 = temp1->next;
    temp2 = temp2->next;
}

temp3在第一次迭代中将为NULL,因此您下次进行以下操作:

(temp3->val) = (val - 10);

您取消引用NULL指针并崩溃。

您需要在每个循环中malloc一个新元素。因此,您不仅需要执行temp3 = temp3->next;,还需要在循环中添加以下内容:

temp3->next = malloc(sizeof(struct ListNode));   // No need for cast
temp3 = temp3->next;
if (!temp3->) exit(0);
temp3->val = 0;
temp3->next = NULL;

(这适用于您的所有循环)

还请注意,start未初始化的。请记住将其初始化为NULL

还要看下面的代码:

        (temp3->val) = (val - 10); //error here
        temp1 = temp1->next;

        (temp1->val) = ((temp1->val) + 1);

我认为您还需要查看以下两行。

        (temp3->val) = (val - 10);
        temp1 = temp1->next;               // Here you change temp1

        (temp1->val) = ((temp1->val) + 1); // Here you dereference temp1

现在,如果temp1在更改时变为NULL,则取消引用将导致另一次崩溃。

您应该这样做:

        (temp3->val) = (val - 10);
        temp1 = temp1->next;

        if (temp1)
        {
            (temp1->val) = ((temp1->val) + 1);
        }

除此之外,还会进行此更改:

temp3 = (struct ListNode*)malloc(sizeof(struct ListNode));

if (!temp3)   // Put the check here
    exit(0);

temp3->val = 0;
temp3->next = NULL;

// if (!temp3)  Remove this code
//    exit(0);

顺便说一句:您无需强制投放malloc,只需执行

temp3 = malloc(sizeof(struct ListNode));