写这段代码的正确方式是什么?我想做一个循环缓冲区,它将接收一个指向某种类型数据的指针作为参数。这样我就写了not working。我对circular_buf_put函数有问题。它指出无效使用的void表达式。error: invalid use of void expression cb->data[cb->head]=data;在这里使用它的正确方法是什么?
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++;
}发布于 2021-09-26 19:29:20
指出无效表达式使用无效。
因为有这一行:
cbuf->data[cbuf->head] = data;您正在取消对空指针的引用,这在C中是非法的。您需要将其强制转换为另一种类型,然后才能取消对它的引用。
发布于 2021-09-26 19:38:11
我会这样实现它。在结构中你不需要这么多的信息。您只需要知道元素的尾部、头部、大小和元素大小。
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;
}https://stackoverflow.com/questions/69337684
复制相似问题