我对这里的指针缺乏理解foo1是foo类型的指针。在出队列中,有一个foo类型的项列表,这些项是由queueList动态分配传入的。我的任务是让foo1指向队列的头部,但是,访问*data传递到dequeue()的foo1数据不是指foo1指针吗?
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
};
编辑:foo1未在main中初始化。我想在出队列中初始化它,方法是将它设置为已入队的不同结构体foo*指针。
Edit2:队列包含一个结构体foo*指针列表。
第三版:多亏了wildplaser,它被修复为(void*)foo1->(void*)&foo1.但是为什么我必须使用&foo1而不是(void*)?
在此代码中:
struct foo* foo1;
dequeue(myQueueList, (void*) foo1);
表达式(void *)foo1
会导致未定义的行为,因为您使用了未初始化指针的值。
您想要做的概念是将foo1
的地址传递给函数,以便函数可以修改foo1
。您需要&
运算符来查找事物的地址。
然而,该函数对struct foo *
一无所知。void **
不是通用指针类型;它是一个指向CCD_ 7的指针。因此,要使此代码在不更改dequeue
定义的情况下工作,您需要创建一个void *
变量:
void *vfoo;
dequeue(myQueueList, &vfoo);
struct foo *foo1 = vfoo;
如果你能改变dequeue
的设计,它会更容易使用;特别是使其返回void *
。然后你就可以写struct foo *foo1 = dequeue(myQueueList);
了。
注意:在评论中,建议使用dequeue(myQueueList, (void **)&vfoo);
,但由于严格的混叠违规,这将导致未定义的行为。struct foo *
类型的对象不能通过void *
类型的左值访问。