c-取消引用void**参数时的Segfault



我对这里的指针缺乏理解foo1foo类型的指针。在出队列中,有一个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 *类型的左值访问。

最新更新