如何使用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);
注意事项:
- 先转
uint8_t*做算术运算,规避部分编译器不支持void*类型直接算术运算的兼容性问题- 不要给宏传入带副作用的参数(如
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
相关产品推荐
相关产品推荐

