C структура, содержащая ссылки на другую структуру - PullRequest
1 голос
/ 22 февраля 2020

Я изучаю C и пытаюсь создать динамическую c двустороннюю очередь. Мне нужно иметь один элемент структуры, который содержит ссылки на начало и конец очереди (голова, хвост узла типа), и я пытаюсь передать этот элемент в функцию и выделить память для узла головы и хвоста. И я получаю ошибку сегментации.

Мои структуры

struct node_st {
    struct node_st* prev_node;
    struct node_st* next_node;

    // Value type can be changed.
    int value;

    bool is_zero_element;
};

typedef struct node_st node;

struct deque_link {
  struct node_st* head;
  struct node_st* tail;
  int errorcode;
};

typedef struct deque_link dlink;

Основная функция

#include "deque.h"
#include <stdio.h>

int main() {
    dlink* deque;
    deque_create(deque);
}

Функция deque_create ()

void deque_create(dlink* deque) {
  deque->head = deque->tail = (node*)malloc(sizeof(node));

}

Я полагаю, я недостаточно понимаю указатели , но я буду очень рад, если кто-то может помочь.

1 Ответ

1 голос
/ 22 февраля 2020

Указатель deque, который вы передаете deque_create, не инициализирован. Имеет неопределенный («мусорный») контент. Поэтому он не указывает на действительную деку. Но вы пытаетесь получить к нему доступ с помощью оператора ->.

Ваша инициализация / создание deque находится на неправильном уровне: вы пытаетесь создать узлы, но вы должны создать deque (без каких-либо узлов, изначально .)

Вы можете написать функцию-конструктор, которая выделяет память и инициализирует ее:

dlink *deque_create(void)
{
    dlink *deque = malloc(sizeof(*deque));

    // Handle allocation failure

    deque->head = deque->tail = NULL;
    deque->errorcode = 0;

    return deque;
}

Затем используйте ее так:

dlink* deque = deque_create();

// do stuff with deque
// delete deque and its nodes

Вы также должны написать Функция деструктора, которая удаляет все узлы для дополнения конструктора.

...