EXC_BAD_ACCESS Связанные списки в c - PullRequest
0 голосов
/ 27 мая 2019

Я создал программу на C, чтобы найти точку пересечения двух связанных списков.Тем не менее, когда я запускаю его, у меня действительно возникает ошибка EXC_BAD_ACCESS (код = 1, адрес = 0x8) в функции «прыжки» в строку «shorttest_temp = shortest_temp-> next;»Вы знаете, как я могу соответствовать этому?спасибо!

struct Node{
    int value;
    struct Node *next;
};

int jumping(int diff, struct Node* longest_list, struct Node* shortest_list);

void push(struct Node** head_ref, int new_data){
    struct Node* new_node = (struct Node*) malloc(sizeof(struct Node));
    new_node->value = new_data;
    new_node->next = *head_ref;
    *head_ref = new_node;
}

int counter(struct Node* head){
    int counter = 0;
    struct Node* current = head;
    while(current != NULL){
        counter++;
        current = current->next;
    }
    return counter;
}

int difference(struct Node* list_one, struct Node* list_two){
    int diff;
    if(counter(list_one)>counter(list_two)){
        diff = counter(list_one) - counter(list_two);
        return jumping(diff, list_one, list_two);

    }
    else{
        diff = counter(list_two) - counter(list_one);
        return jumping(diff, list_two, list_one);
    }
}

int jumping(int diff, struct Node* longest_list, struct Node* shortest_list){
    struct Node* longest_temp = longest_list;
    struct Node* shortest_temp = shortest_list;


    for(int i=0; i < diff ; i++){
        longest_temp = longest_temp -> next;
        i++;
    }
    while(longest_list != NULL && shortest_list !=NULL){
        longest_temp = longest_temp->next;
        shortest_temp = shortest_temp->next;
        if(longest_temp == shortest_temp){
            return shortest_list->value;
        }
    }
    return -1;
}


int main(int argc, char* argv[]){
    struct Node* list_one = NULL;
    struct Node* list_two = NULL;
    push(&list_one,4);
    push(&list_one,5);
    push(&list_two,1);
    push(&list_two,2);
    push(&list_two,3);
    push(&list_two,4);
    push(&list_two,5);

    printf("difference: %d", difference(list_one,list_two));

    return 0;
}

Спасибо!

1 Ответ

0 голосов
/ 28 мая 2019

относительно:

longest_temp = longest_temp->next;
shortest_temp = shortest_temp->next;

Вышеуказанные изменения, где указатели longest_temp и shortest_temp указывают.Однако это изменение может иметь любой из тех указателей, которые теперь содержат NULL.

Тогда оператор:

return shortest_list->value;

может получить доступ к некоторому смещению от адреса 0 (NULL).Это приводит к событию ошибки сегмента.

Всегда проверяйте каждый указатель на NULL, прежде чем получить доступ к любому смещению от этого указателя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...