C指针骗局

C指针骗局,c,queue,C,Queue,我试图在C语言中实现一个队列(使用链表)来存储指向数据的指针。en队列似乎工作正常,但在解队列时指针出现了一些问题 我的主要观点是: 出列(): 根据我的调试,for循环的main()中*数据指针的值似乎没有保留在dequeue()中设置的值。我错过了什么 编辑: 您正在设置“value”变量的值,该变量是指向函数的本地指针 如果要设置其指向的值,请使用: *value = 0; 以及: Edit(在问题编辑之后):由于queue_node.data本身就是一个指针,因此传递一个void**

我试图在C语言中实现一个队列(使用链表)来存储指向数据的指针。en队列似乎工作正常,但在解队列时指针出现了一些问题

我的主要观点是:

出列():

根据我的调试,for循环的main()中*数据指针的值似乎没有保留在dequeue()中设置的值。我错过了什么

编辑:


您正在设置“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;