C语言带void指针参数的环形缓冲区代码编写报错咨询
报错原因
void*是无类型指针,C标准没有定义void类型的内存占用长度,因此不能直接对void*指针做下标访问、加减偏移、解引用这类操作,你代码里cbuf->data[cbuf->head] = data的写法本身就不符合C语法规则。
另外你的逻辑也存在问题:你要实现的是存储任意类型的实际数据,不是存储data指针本身,所以不能直接做指针赋值,需要把data指向的内存数据拷贝到环形缓冲区对应的存储位置。
正确实现思路
- 将结构体中的
void *data强转为char*类型(char长度固定为1字节,可按字节计算偏移) - 用
head * objectSize计算出当前写入位置的字节偏移量 - 调用
memcpy把data指向的实际数据拷贝到缓冲区对应位置 - 补充环形缓冲区的边界判断:写入前判断缓冲区是否已满,
head超过容量后要取模实现循环逻辑
修正后的代码示例
circular_buf_put函数修正代码
#include <string.h> // 需引入该头文件使用memcpy void circular_buf_put(circular_buf *cbuf, void *data) { // 缓冲区已满时可自定义处理逻辑,比如返回错误或者覆盖旧数据,此处做简单拦截 if (cbuf->size >= cbuf->capacity) { return; } // 计算当前写入位置的字节偏移 char *write_pos = (char *)cbuf->data + cbuf->head * cbuf->objectSize; // 把入参指向的实际数据拷贝到缓冲区 memcpy(write_pos, data, cbuf->objectSize); // head指针移动,超过容量后取模实现环形效果 cbuf->head = (cbuf->head + 1) % cbuf->capacity; cbuf->size++; }
其他代码优化点
你原有的circular_buf_init函数定义了int返回值类型,但没有返回逻辑,需要补充:
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; return 0; // 初始化成功返回0,可自定义错误码返回规则 }
内容的提问来源于stack exchange,提问作者gag
相关产品推荐
相关产品推荐

