如何将多类型指针指向的数据复制到void*缓冲区?
将多类型指针数据复制到void*缓冲区
核心实现代码
在你的条件判断块中,通过遍历指针列表+逐段memcpy就能完成高效复制,这是最直接可靠的方式:
inputDataSize = std::accumulate(vecDataSizes.begin(), vecDataSizes.end(), 0); if(inputDataSize == destinationBufferSize && inputDataSize != 0) { unsigned char* destPtr = static_cast<unsigned char*>(destinationBuffer); // 转为字节级指针做位置移动 for(size_t i = 0; i < vecData.size(); ++i) { const void* srcPtr = vecData[i]; size_t copySize = vecDataSizes[i]; std::memcpy(destPtr, srcPtr, copySize); destPtr += copySize; // 更新目标指针,让下一段数据接在当前内容后面 } }
关键说明
- 用
unsigned char*转换目标缓冲区:void*无法直接进行指针算术运算,转为unsigned char*可以确保每次移动都是按字节为单位,完全匹配内存复制的字节操作逻辑。 memcpy是最优选择:作为C/C++标准库的内存块复制函数,它直接操作二进制数据,不管原指针的类型是什么,只要你能准确提供数据的字节大小,就能完成正确复制,效率也是同类操作中最高的。- 遍历逻辑:依次取出每个源指针和对应的数据大小,复制到目标缓冲区的当前位置,之后更新目标指针的位置,保证所有数据按顺序拼接。
常见失败原因排查
如果之前尝试std::copy失败,大概率是因为std::copy需要迭代器,而void*无法直接生成合法迭代器;如果memcpy失败,通常是没有正确更新目标指针位置,导致每次复制都覆盖了之前的数据。
内容的提问来源于stack exchange,提问作者Xyt
相关产品推荐
相关产品推荐

