доступ к элементу внутри нулевого указателя типа struct structVarable - PullRequest
0 голосов
/ 01 декабря 2018
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);). Я попытался добавить эти строки кода после выделения памяти для temp3 (temp3->val=0; temp3->next=NULL;), но безрезультатно.

1 Ответ

0 голосов
/ 01 декабря 2018

Проблема в том, что вы забыли malloc новые элементы для нового списка (он же start / temp3) внутри циклов.

Здесь:

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);

вы разыменовываете нулевой указатель и получаете сбой.

Вам потребуется 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 становится НЕДЕЙСТВИТЕЛЬНЫМ, когда это изменяется, разыменование вызовет другой сбой.

Вы должны сделать:

        (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));
...