gpt4 book ai didi

c - 取消引用 void ** 参数时出现段错误

转载 作者:太空宇宙 更新时间:2023-11-04 08:07:03 24 4
gpt4 key购买 nike

我对这里的指针缺乏理解。 foo1 是一个foo 类型的指针。在dequeue中,有一个foo类型的item列表,是queueList传入的动态分配的。我的任务是让 foo1 指向队列的头部,但是,访问传递给 dequeue()foo1 指针*data 导致段错误。这是我缺乏理解的地方。 *data 不是指 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 中初始化。我想通过将其设置为等于已入队的不同 struct foo* 指针来在出队中对其进行初始化。

Edit2:队列包含一个 struct foo* 指针列表。

Edit3:感谢 wildplasser,它已通过 (void*)foo1 -> (void*)&foo1 修复。但为什么我必须使用 &foo1 而不是 (void*)?

最佳答案

在这段代码中:

struct foo* foo1;
dequeue(myQueueList, (void*) foo1);

表达式 (void *)foo1 导致未定义的行为,因为您使用了未初始化指针的值。

你想做的事情的概念是将foo1地址传递给函数,这样函数就可以修改foo1 .您需要 & 运算符来查找事物的地址。

但是该函数对struct foo *一无所知。 void ** 不是通用指针类型;它是一个指向 void * 的指针,仅此而已。因此,要使这段代码在不更改 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 * 类型的左值访问。

关于c - 取消引用 void ** 参数时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42124155/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com