首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有空指针参数的循环缓冲区

具有空指针参数的循环缓冲区
EN

Stack Overflow用户
提问于 2021-09-26 18:14:59
回答 2查看 81关注 0票数 0

写这段代码的正确方式是什么?我想做一个循环缓冲区,它将接收一个指向某种类型数据的指针作为参数。这样我就写了not working。我对circular_buf_put函数有问题。它指出无效使用的void表达式。error: invalid use of void expression cb->data[cb->head]=data;在这里使用它的正确方法是什么?

代码语言:javascript
复制
typedef struct circular_buf{
    void *data;
    size_t tail;
    size_t head;
    size_t capacity;
    size_t objectSize; 
    size_t size; 
} circular_buf;

int circular_buf_init(struct circular_buf *cb, void *data, size_t objectSize, size_t capacity)
  {
  cb->data=data;
  cb->objectSize=objectSize;
  cb->capacity=capacity;
  cb->tail=0;
  cb->head=0;
  cb->size=0;
   }

void circular_buf_put(circular_buf *cbuf, void  *data)
{
    cbuf->data[cbuf->head] = data;
    cbuf->head++;
    cbuf->size++;

}
EN

回答 2

Stack Overflow用户

发布于 2021-09-26 19:29:20

指出无效表达式使用无效。

因为有这一行:

代码语言:javascript
复制
cbuf->data[cbuf->head] = data;

您正在取消对空指针的引用,这在C中是非法的。您需要将其强制转换为另一种类型,然后才能取消对它的引用。

票数 1
EN

Stack Overflow用户

发布于 2021-09-26 19:38:11

我会这样实现它。在结构中你不需要这么多的信息。您只需要知道元素的尾部、头部、大小和元素大小。

代码语言:javascript
复制
typedef struct
{
    size_t tail;
    size_t head;
    size_t size; 
    size_t obj_size;
    unsigned char data[];
} circular_buf;

circular_buf *create(size_t size, size_t obj_size)
{
    circular_buf *cb = malloc(sizeof(*cb) + size * obj_size);
    if(cb)
    {
        cb -> tail = 0;
        cb -> head = 0;
        cb -> size = size;
        cb -> obj_size = obj_size;
    }
    return cb;
}

size_t inc(size_t val, circular_buf *cb)
{
    if(val == cb -> size - 1) val = 0;
    else val++;

    return val;
}

int circular_buf_put(circular_buf *cb, const void *data)
{
    size_t new_tail = inc(cb -> tail, cb);
    if (new_tail == cb -> head) return -1; // buffer full
    memcpy(&cb->data[cb -> tail * cb -> size], data, cb -> obj_size);
    cb -> tail = new_tail;
    return 0;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69337684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档