You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言带void指针参数的环形缓冲区代码编写报错咨询

报错原因

void*是无类型指针,C标准没有定义void类型的内存占用长度,因此不能直接对void*指针做下标访问、加减偏移、解引用这类操作,你代码里cbuf->data[cbuf->head] = data的写法本身就不符合C语法规则。
另外你的逻辑也存在问题:你要实现的是存储任意类型的实际数据,不是存储data指针本身,所以不能直接做指针赋值,需要把data指向的内存数据拷贝到环形缓冲区对应的存储位置。

正确实现思路

  1. 将结构体中的void *data强转为char*类型(char长度固定为1字节,可按字节计算偏移)
  2. 用head * objectSize计算出当前写入位置的字节偏移量
  3. 调用memcpy把data指向的实际数据拷贝到缓冲区对应位置
  4. 补充环形缓冲区的边界判断:写入前判断缓冲区是否已满,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 03:30:03