gpt4 book ai didi

C指针恶作剧

转载 作者:行者123 更新时间:2023-12-02 08:53:58 25 4
gpt4 key购买 nike

我正在尝试用 C 实现一个队列(使用链接列表)来存储指向数据的指针。入队似乎工作正常,但出队时的指针出现一些问题。

在我的 main() 中:

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

最佳答案

queue_nodedata保存一个指向某个值的指针(这里它是一个int,但它可能并不总是正确的,否则你会使用 int 代替...)

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

因此,更改函数的签名以接受 void**,不要在 main() 中为 int 分配空间,但以 &data 作为参数调用 dequeue,其中 void * data = 0。完成后不要忘记释放数据。在出队中,设置*value = q->first->data

关于C指针恶作剧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6392324/

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