Ошибка сегментации свободных причин в C - PullRequest
0 голосов
/ 26 февраля 2019

В следующей программе, которая предназначена только для образовательных целей, я не могу понять, почему free() вызывает ошибку сегментации.В последнем цикле я пытаюсь очистить мой список двухсвязных указателей, но даже один free() в first_node (вне цикла, если я его там размещу) приводит к ошибке сегментации ... Кто-нибудь видит, почему?

#include <stdio.h>
#include <stdlib.h>

typedef struct Node Node;

struct Node {
    Node *prev;
    Node *next;
    int val;
};

int main() {
    Node *first_node;
    Node *active_node;
    Node *prev_node;
    first_node->val = 0;
    active_node = first_node;
    for (int c = 1; c < 10 ; c = c + 1) {
        active_node->next = (Node *)malloc(sizeof(Node));
        active_node->next->val = c;
        active_node->next->prev = active_node;
        prev_node = active_node;
        active_node = active_node->next;
    }
    active_node = first_node;
    while (active_node) {
        printf("Node: %d\n", active_node->val);
        prev_node = active_node;
        active_node = active_node->next;
    }

    active_node = first_node;
    while (active_node) {
        prev_node = active_node;
        active_node = active_node->next;
        free(prev_node); 
    }
    return 0;
}

Я уверен, что это free(), так как когда я комментирую эту строку, программа работает нормально.

Мой вывод выглядит так:

Node: 0
Node: 1
Node: 2
Node: 3
Node: 4
Node: 5
Node: 6
Node: 7
Node: 8
Node: 9
Segmentation fault (core dumped)

1 Ответ

0 голосов
/ 26 февраля 2019

first_node не инициализируется при выполнении first_node->val = 0;.active_node получает значение этого неинициализированного указателя и используется для последнего узла списка.

На самом деле удивительно, что программа вообще запускается, у вас есть неопределенное поведение для первого оператора main() function.

Просто инициализируйте active_node до NULL и исправьте код инициализации:

#include <stdio.h>
#include <stdlib.h>

typedef struct Node Node;

struct Node {
    Node *prev;
    Node *next;
    int val;
};

int main() {
    Node *first_node;
    Node *active_node;
    Node *prev_node;

    first_node = prev_node = NULL;
    for (int c = 0; c < 10; c = c + 1) {
        Node *new_node = (Node *)malloc(sizeof(Node));
        if (new_node == NULL)
            return 1;
        new_node->val = c;
        new_node->prev = prev_node;
        new_node->next = NULL;
        if (prev_node)
            prev_node->next = new_node;
        else
            first_node = new_node;
        prev_node = new_node;
    }

    active_node = first_node;
    while (active_node) {
        printf("Node: %d\n", active_node->val);
        active_node = active_node->next;
    }

    active_node = first_node;
    while (active_node) {
        prev_node = active_node;
        active_node = active_node->next;
        free(prev_node); 
    }
    return 0;
}
...