C指针骗局
我试图在C语言中实现一个队列(使用链表)来存储指向数据的指针。en队列似乎工作正常,但在解队列时指针出现了一些问题 我的主要观点是: 出列(): 根据我的调试,for循环的main()中*数据指针的值似乎没有保留在dequeue()中设置的值。我错过了什么 编辑:C指针骗局,c,queue,C,Queue,我试图在C语言中实现一个队列(使用链表)来存储指向数据的指针。en队列似乎工作正常,但在解队列时指针出现了一些问题 我的主要观点是: 出列(): 根据我的调试,for循环的main()中*数据指针的值似乎没有保留在dequeue()中设置的值。我错过了什么 编辑: 您正在设置“value”变量的值,该变量是指向函数的本地指针 如果要设置其指向的值,请使用: *value = 0; 以及: Edit(在问题编辑之后):由于queue_node.data本身就是一个指针,因此传递一个void**
您正在设置“value”变量的值,该变量是指向函数的本地指针 如果要设置其指向的值,请使用:
*value = 0;
以及:
Edit(在问题编辑之后):由于queue_node.data本身就是一个指针,因此传递一个void**更有意义,正如上面@Andrei所指出的。假设数据是一个(void*),并且您想要数据指向的(int)值,您必须替换它
value=q->first->data代码>
与
*(int*)value=*(int*)q->first->data代码>
在函数deque()中 队列节点
的数据
包含一个指向某个值的指针(这里是int
,但它可能并不总是正确的,否则您将使用int
)
由于此值是用malloc
分配的(并且不是局部变量),因此您还需要在某个时候释放它
因此,将函数的签名更改为接受void**
,不要在main()
中为int
分配空间,而是使用&data
作为参数调用dequeue
,其中void*data=0
。完成后不要忘记释放数据。
在dequeue
中,设置*value=q->first->data
是否愿意分享您对队列
和队列节点
结构的定义,或者猜测游戏是问题的一部分?更新:谢谢!还有,你为什么选择免费(tmp)
?你能保证这是一个指向malloc()ed内存的有效指针吗?正如下面的答案所示,你没有将结果分配给正确的对象。您希望返回一个void*
,因此您的参数应该是void**pp
,并且您分配*pp=q->first->data
。但是在dequeue()函数中,您不知道它指向您更新问题的日期的数据类型,@Andrei有正确的答案。@Alexei:别忘了测试答案,然后接受它;)@Andrei,这是在显示队列节点定义的编辑之前发布的。根据投票结果,我猜测“data”成员是int。如果不编辑答案,系统不允许我删除否决票。
int dequeue(struct queue *q, void *value)
{
struct queue_node *tmp;
if (!q->first) {
value = 0;
return 1;
}
value = q->first->data;
tmp = q->first;
if (q->first == q->last)
q->first = q->last = NULL;
else
q->first = q->first->next;
free(tmp);
return 0;
}
struct queue_node
{
struct queue_node *next;
void* data;
};
struct queue
{
struct queue_node *first;
struct queue_node *last;
};
*value = 0;
*value = q->first->data;