具体的C fifo实现混乱

时间:2014-03-13 06:20:39

标签: c fifo

我需要为我正在进行的项目使用FIFO。我在互联网上找到了这个实现,我无法弄清楚这个功能发生了什么。我希望有人可以启发我。

/* Free an entire fifo */
void fifo_free(fifo_t *f, void (*freefn)(void *))
{
    fifonode_t *fn = f->f_head;
    fifonode_t *tmp;

    if (freefn == NULL)
        freefn = fifo_nullfree;

    while (fn) {
        (*freefn)(fn->fn_data);

        tmp = fn;
        fn = fn->fn_next;
        free(tmp);
    }

    free(f);
}

...

/*ARGSUSED*/
static void fifo_nullfree(void *arg)
{
    /* this function intentionally left blank */
}
  1. 了解它如何使用void (*freefn)(void *)作为参数?为什么?为什么该指针传递给函数? (*freefn)(fn->fn_data)

  2. 的目的是什么?
  3. 这些线的重点是什么?

    if (freefn == NULL)
        freefn = fifo_nullfree;
    

    在这种情况下评论是否同样有效?

  4. 您可以查看此实施的完整副本here

1 个答案:

答案 0 :(得分:4)

  1. fifo_free函数只知道如何释放用于fifonode_t项的内存,它不知道如何处理这些项中的数据(由fn_data指向)。这是freefn进来的地方。

    参数void (*freefn)(void *)是指向函数的指针。该函数采用void指针。这用于释放存储在FIFO中每个fifonode_t的数据。

  2. 在某些情况下,您可能不需要做任何有关释放额外数据的事情(比如说您存储了指向其他静态数据的指针)。在这种情况下,您可以为freefn传递NULL,函数将使用fifo_nullfree作为函数,它基本上什么都不做。

    注意:fifo_free函数可以很容易地在循环内完成if测试,如果它不是NULL,则只调用freefn函数。可能他们有一些理由不这样做。