我正在尝试在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;
};
答案 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();
中