将结构复制到数组的一个元素中

问题描述 投票:0回答:1

在我正在编写的代码中,我需要执行以下操作:

  1. 创建一个映射,其中每个值都是固定大小的缓冲区
  2. 使用 memcpy 用一些本地定义的对象填充映射的一个值的一个元素(即数组的一个元素本身就是映射的值)

以下代码是该概念的一个小示例:

#include <iostream>
#include <map>

int main()
{
    struct hdr {
        int cpi_length = 42;
    } ;

    void* this_hdr = new hdr;
    std::map<int, hdr(*)[20]> SP;
    std::cout << sizeof(hdr) << std::endl; // "4"
    std::cout << sizeof(this_hdr) << std::endl; // "4"
    std::cout << sizeof(SP[0][0]); // "80"
    std::memcpy(SP[0][0], this_hdr, sizeof(hdr)); // "Error: access violation"
    std::cout << SP[0][0]->cpi_length;
    return 0;
}

这给我带来了两个问题:1)如何解决尝试使用 memcpy 时的运行时错误,2)一旦解决了错误,我如何确保此代码将执行我所描述的操作?

如命令

sizeof
所示,被复制的结构实例的大小与结构本身相同,并且(显然)比要复制到的数组元素的大小小得多。那么为什么会出现访问冲突呢?应该还有足够的空间。

我知道为什么在这种情况下使用

memcpy
可能看起来很愚蠢,为什么我要使用缓冲区指针而不是向量等。这只是一个可重现的示例,请理解在实际代码中我受到限制这些实施选择。现在,我不再假设我只是犯了一些简单的错误,例如在引用/取消引用指针时混淆了语法。

c++ dictionary pointers memcpy
1个回答
1
投票

创建一个映射,其中每个值都是固定大小的缓冲区

那不是你在做的事。这是您忘记的一项测试:

std::cout << sizeof(SP[0]); // How large is the actual element of the map?

这是一个映射,其中每个值都是固定大小的缓冲区:

std::map<int, std::array<hdr, 20>> SP;
© www.soinside.com 2019 - 2024. All rights reserved.