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
相关产品推荐
相关产品推荐

