2016-11-26 5 views
0

Я хочу написать программу со списками в списках. Так есть файл list.h:разыменование «void *» указатель - список в списке

typedef struct node { 
    void *ptr; 
    struct node *next; 
    struct node *prev; 
} NODE; 

typedef struct list { 
    struct node *head; 
    struct node *tail; 
    int size; 
    char name[MAX_SIZE_NAME]; 
} LIST; 

В первом у меня есть список, например, list_. Теперь я выделяю 5 элементов.

И в каждом узле я хочу выделить новый список. I судимого с этим кодом:

if (list_->head->next == list_->tail) { 
    list_ins_next(list_); 
    ptr = list_->tail->prev; 
    ptr->ptr = malloc(sizeof(LIST)); 
    ptr->ptr->head = malloc(sizeof(NODE)); 

К сожалению, я не имею так много опыта программирования, но было бы здорово, если бы вы помогли мне

ошибки: разыменования Пустоты * указателю

+0

Что такое нода :: ptr' означает представлять? Это значит всегда указывать на содержащий «struct list» или быть произвольным хранилищем данных? – Dai

+0

Также, если вы используете 'void *', вы, вероятно, делаете что-то неправильно (потому что вы отказываетесь от безопасности типов). – Dai

ответ

2
ptr->ptr->head = malloc(sizeof(NODE)); 

эквивалентно:

(*(ptr->ptr)).head = malloc(sizeof(NODE)); 

Выражение *(ptr->ptr) недействителен, так как вы не можете разыграть void*.

Чтобы разыскать его, вам понадобится указатель типа LIST*, а затем используйте объект head.

Использование:

((LIST*)ptr->ptr)->head = malloc(sizeof(NODE)); 
+0

спасибо :) теперь он работает – ben