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

如何使用memcpy()自动递增目标指针,免去手动调整的步骤?

解决方案
  • 方案1:封装带指针自增的宏
    这是最轻量化、无额外运行开销的实现,兼容绝大多数开发场景:
#include <stdint.h>
#include <string.h>

// 宏定义:执行memcpy后自动递增目标指针,do/while(0)为标准写法避免分支语句下的语法问题
#define MEMCPY_ADVANCE(dest, src, n) do { \
    memcpy((dest), (src), (n)); \
    (dest) = (void*)((uint8_t*)(dest) + (n)); \
} while(0)

调用示例:

// 无需手动执行dest += 偏移操作
MEMCPY_ADVANCE(dest, src1, 1);
MEMCPY_ADVANCE(dest, src2, 2);
MEMCPY_ADVANCE(dest, src3, 1024);

注意事项:

  1. 先转uint8_t*做算术运算,规避部分编译器不支持void*类型直接算术运算的兼容性问题
  2. 不要给宏传入带副作用的参数(如get_dest_ptr()这类会修改外部状态的函数),避免多次执行产生非预期结果
  • 方案2:封装内联函数(适合需要类型安全检查的场景)
    如果希望规避宏的副作用问题,可以用二级指针封装内联函数,现代编译器会自动优化无额外调用开销:
#include <stdint.h>
#include <string.h>

static inline void memcpy_advance(uint8_t **dest, const void *src, size_t len)
{
    memcpy(*dest, src, len);
    *dest += len;
}

调用示例:

// 调用时传入dest指针的地址即可
memcpy_advance(&dest, src1, 1);
memcpy_advance(&dest, src2, 2);
memcpy_advance(&dest, src3, 1024);
  • 方案3:打包结构体批量拷贝(适合固定字段顺序的场景)
    如果每次拷贝的字段顺序、长度都是固定的,可以直接定义紧凑结构体一次性完成操作,无需多次调用memcpy:
// 定义紧凑结构体,取消内存对齐填充
typedef struct __attribute__((packed)) {
    uint8_t field1;
    uint16_t field2;
    uint8_t field3[1024];
} CopyBlock;

// 一次性完成所有内容赋值/拷贝
CopyBlock *block = (CopyBlock*)dest;
block->field1 = *(uint8_t*)src1;
block->field2 = *(uint16_t*)src2;
memcpy(block->field3, src3, 1024);
// 要递增指针直接加结构体总大小即可
dest += sizeof(CopyBlock);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 05:15:08