0

次の関数をテストしようとした後、プログラムを実行しようとすると、コメントアウトされた行がセグフォルトを引き起こすと判断しました。

uint8_t ll_push_front(struct List *list, int value){
        if (list == NULL)
                return 1;
        struct ListEntry *node = (struct ListEntry *) malloc (sizeof(struct ListEntry));
        if (node == NULL) exit (1);
        if (list->head_ == NULL || list->tail_ == NULL || list->size_ == 0) {
                list->head_ = node;
                list->tail_ = node;
                node->prev_ = NULL;
                node->next_ = NULL;
    // =====>>  *(node_->val_) = value;
                ++(list->size_);
                return 0;
        }
        list->head_->prev_ = node;
        node->next_ = list->head_;
        node->prev_ = NULL;
        *(node->val_) = value;
        list->head_ = node;
        ++(list->size_);
        return 0;
}

行うことの何が問題で*(node_->val_) = valueあり、どのように適切に宣言する必要がありますか?

構造体は次のとおりです。

struct ListEntry {
    struct ListEntry * next_;  // The next item in the linked list
    struct ListEntry * prev_;  // The next item in the linked list
    int * val_;                // The value for this entry
};

/* Lists consist of a chain of list entries linked between head and tail */
struct List {
    struct ListEntry * head_;  // Pointer to the front/head of the list
    struct ListEntry * tail_;  // Pointer to the end/tail of the list
    unsigned size_;            // The size of the list
};

これは私がリストを初期化する方法です:

void ll_init(struct List **list) {
        *list = (struct List *) malloc (sizeof(struct List));
        if (list == NULL) exit (1);
        (*list)->head_ = 0;
        (*list)->tail_ = 0;
        (*list)->size_ = 0;
}
4

2 に答える 2