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

如何将多类型指针指向的数据复制到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 10:24:13