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

C语言使用memcpy向缓冲区末尾写入数据无需手动偏移的实现方法

方案1:封装自动维护偏移的写入工具(兼容性好、可复用性高)

你可以定义一个简单的缓冲区写入上下文结构体,自动累计已写入长度,完全不用手动计算偏移:

#include <string.h>
#include <stdint.h>

// 缓冲区写入上下文
typedef struct {
    char* buf;          // 缓冲区起始地址
    size_t total_size;  // 缓冲区总大小
    size_t offset;      // 当前写入偏移
} BufWriter;

// 初始化写入器
void buf_writer_init(BufWriter* w, void* buf, size_t total_size) {
    w->buf = (char*)buf;
    w->total_size = total_size;
    w->offset = 0;
}

// 写入任意数据到缓冲区
int buf_writer_write(BufWriter* w, const void* data, size_t len) {
    // 你已经确认总大小刚好匹配的话可以省略边界判断
    if (w->offset + len > w->total_size) return -1;
    memcpy(w->buf + w->offset, data, len);
    w->offset += len;
    return 0;
}

使用示例:

int main() {
    int a = 10;
    const char* s = "hello world";
    char buf[100];
    
    BufWriter w;
    buf_writer_init(&w, buf, sizeof(buf));
    // 连续写入不需要手动计算偏移
    buf_writer_write(&w, &a, sizeof(a)); 
    buf_writer_write(&w, s, strlen(s));
    
    // 后续还可以继续写入其他变量
    int b = 20;
    buf_writer_write(&w, &b, sizeof(b));
    const char* s2 = "test";
    buf_writer_write(&w, s2, strlen(s2));
    return 0;
}

注意:你给出的示例代码存在错误,memcpy(buf, a, 4);是非法用法,memcpy第二个参数需要传源数据的地址,应该写成memcpy(buf, &a, 4);,而且直接硬编码4作为长度兼容性差,建议统一用sizeof(a)获取类型长度。

方案2:独立维护写入指针(轻量化、无需封装)

如果不想引入结构体,也可以单独维护一个当前写入位置的指针,写法更简洁:

int main() {
    int a = 10;
    const char* s = "hello world";
    char buf[100];
    char* cur = buf; // 当前写入位置指针
    
    memcpy(cur, &a, sizeof(a));
    cur += sizeof(a); // 指针自动后移
    
    memcpy(cur, s, strlen(s));
    cur += strlen(s);
    
    // 继续写入其他数据
    int b = 20;
    memcpy(cur, &b, sizeof(b));
    cur += sizeof(b);
    return 0;
}

如果写入的缓冲区需要跨端/跨设备传输,还要额外考虑大小端、内存对齐问题,写入前建议先明确统一的内存布局规则。

内容的提问来源于stack exchange,提问作者0xRyN

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 23:45:06