6

我已经使用 void 指针在 C 中实现了一个基本的队列结构。程序如下:

  • 初始化结构 - 我设置要存储在队列中的变量类型的大小
  • push - 我将指针传递给要存储的变量,然后队列为自己抓取一个副本
  • front - 结构返回一个 void* 到前面的元素。我可能只是抓住指针,或者memcpy()它有一个本地副本。

结构本身如下所示:

struct queue
{
    void* start;    //pointer to the beginning of queue
    void* end;      //-||- to the end
    size_t memsize; //size of allocated memory, in bytes
    size_t varsize; //size of a single variable, in bytes
    void* initial_pointer;      //position of the start pointer before pop() operations
};

start 和 end 只是指向当前分配的内存块中某个位置的 void 指针。如果我将元素推入队列,我会将结束指针增加varsize. 如果我 pop(),我只是将结束指针也递减varsize.

我不认为我应该在这里发布函数代码,它超过 100 行。

问题是:这被认为是好的还是坏的做法?为什么不)?

注意:我知道 C 中的队列还有许多其他选项。我只是询问这个队列的质量。

编辑:实现在这里可用:http://89.70.149.19 /stuff/queue.txt (删除空格)

4

2 回答 2

8

void *如果您不知道要存储在队列中的对象的类型和大小,也可以使用(实际上,C 标准库遵循相同的方法,一些示例请参见和memcpy()函数qsort())。但是,最好使用size_t(或者ssize_t如果您需要签名数据类型)来指定存储在队列中的元素的大小。

于 2013-07-18T19:15:13.400 回答
2

您确实没有向我们展示足够的信息来确定您的实施。void*因为用户数据项很好,你不能在 C 中做很多其他事情。

但我强烈怀疑您有一个用于管理各个项目的内部列表元素类型,例如

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

如果是这种情况并且您的startend指针指向此类元素,则您绝对应该在struct queue声明中使用您的元素类型:

struct queue
{
    struct list_item* start;    //pointer to the beginning of queue
    struct list_item* end;      //-||- to the end
    size_t memsize; //size of allocated memory, in bytes
    size_t varsize; //size of a single variable, in bytes
    struct list_item* initial_pointer;      //position of the start pointer before pop() operations
};

为此,您甚至不必将 的定义暴露struct list_itemstruct queue.

于 2013-07-18T19:32:02.540 回答