Мне не хватает понимания указателей здесь. foo1 является указателем типа foo. В dequeue есть список элементов типа foo, которые динамически выделяются в очереди queueList. Моя миссия состоит в том, чтобы получить foo1, чтобы указать на голову очереди, однако, доступ к указателю foo1, который был принят в DEQUEUE() с * данные вызывает Segfault. Здесь мне не хватает понимания. Is * данные не относится к foo1 Указатель?Segfault при разыменовании void ** аргументы
struct foo
{
//Properties Here
};
int main()
{
struct foo* foo1;
dequeue(myQueueList, (void*) foo1);
}
void dequeue(struct queue* queueList, void **data)
{
*data = NULL; //Causes Seg fault if I do this too
*data = queueList->head->data; //Seg fault if I do this as well
return;
}
Моя очередь определяется как:
struct queue
{
node * head;
//other stuff
};
struct node
{
void * data;
//other stuff
};
Edit: foo1 не инициализируется в основной. Я хочу инициализировать его в dequeue, установив его равным другому указателю struct foo *, который был установлен в очередь.
Edit2: queue содержит список указателей struct foo *.
Редактирование 3: благодаря wildplasser, он исправлен с (void *) foo1 -> (void *) & foo1. Но почему я должен использовать & foo1, а не (void *)?
'dequeue (myQueueList, (void *) foo1);' - >> 'dequeue (myQueueList, &foo1);' Также: ваш указатель * foo1 указывает нигде, нет объекта foo, на который он указывает, и это а не NULL. – wildplasser
@wildplasser Почему NULL необходимо для foo1, когда foo1 инициализируется в dequeue? Что я хочу, это foo1, чтобы указать на другой тип foo в куче. Или я думаю об этом неправильно? Я хочу, чтобы эквивалент: struct foo * foo1 = queueList-> head-> data; где данные являются типом void *. –
является 'queueList-> head-> data' a' struct foo * 'тип маскировки как' void * '? – yano