使用void *的C队列实现 - 好的还是坏的做法?

时间:2013-07-18 19:10:37

标签: c pointers queue void

我使用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。如果我弹出(),我只是按varsize递减结束指针。

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

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

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

编辑:这里有实施: http:// 89.70.149.19 /stuff/queue.txt(删除空格)

2 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分: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_item的用户公开struct queue的定义。