【问题标题】:C pointer shenanigansC 指针恶作剧
【发布时间】:2011-06-17 22:07:21
【问题描述】:

我正在尝试在 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;
};

【问题讨论】:

  • 愿意分享您对queuequeue_node 结构的定义,或者猜谜游戏是问题的一部分? 更新:谢谢!
  • 另外,你为什么free(tmp)?你能保证这是一个指向 malloc() 内存的有效指针吗?
  • 正如在下面的答案中,您没有将结果分配给正确的东西。你想返回一个void*,所以你的参数应该是void** pp,然后你分配*pp = q->first->data

标签: c queue


【解决方案1】:

queue_nodedata 持有一个指向某个值的指针(这里是一个int,但它可能并不总是如此,否则你会使用int 来代替......)

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

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

【讨论】:

  • @Alexei:不要忘记测试答案然后接受它;)
【解决方案2】:

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

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

*value = 0; 

和:

*value = q->first->data;

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

【讨论】:

  • @Andrei,这是在显示 queue_node 定义的编辑之前发布的。根据演员表,我猜测“数据”成员是一个 int。
  • 如果您不编辑答案,系统不允许我删除反对票。
【解决方案3】:

假设 data 是一个 (void *) 并且你想要 data 指向的 (int) 值,你必须替换

value = q->first->data;

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

在函数deque()中;

【讨论】:

  • 但是在dequeue()函数中,你不知道它指向的数据类型
  • 现在您更新了问题,@Andrei 得到了正确答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-31
  • 2010-09-23
  • 2011-10-09
  • 2015-01-13
  • 1970-01-01
  • 2015-11-18
相关资源
最近更新 更多