C指针shenanigans

时间:2011-06-17 22:07:22

标签: c queue

我正在尝试在C中实现队列(使用链接列表)来存储指向数据的指针。入队似乎工作得很好,但在排队时指针有些麻烦。

在我的主要():

void* data = malloc(sizeof(int));
dequeue(&Q, data);
printf("(%d) %d\n", k, *(int*)data);

出队():

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;
}

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

编辑:

struct queue_node
{
    struct queue_node *next;    
    void* data;
};

struct queue
{
    struct queue_node *first;
    struct queue_node *last;
};

3 个答案:

答案 0 :(得分:3)

您正在设置“value”变量的值,该变量是函数的本地指针。

如果要设置其指向的值,请使用:

*value = 0; 

*value = q->first->data;

编辑(在编辑问题之后):由于queue_node.data本身就是一个指针,因此传递void **更有意义,正如@Andrei上面所说的那样。

答案 1 :(得分:3)

queue_node的{​​{1}}包含一个指向某个值的指针(此处为data,但它可能不是真的,否则你会使用{{1}而不是...)

由于此值是使用int分配的(并且不是局部变量),因此您还需要在某个时候释放它。

因此,更改函数的签名以接受int,不要为malloc中的void**分配空间,而是使用int调用main()一个参数,其中dequeue。完成后不要忘记&data数据。 在void * data = 0中,设置free

答案 2 :(得分:0)

假设数据是(void *)并且您想要数据指向的(int)值,则必须替换

value = q->first->data;

*(int *)value = *(int *)q->first->data;

在函数deque();