在我正在编写的代码中,我需要执行以下操作:
以下代码是该概念的一个小示例:
#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
可能看起来很愚蠢,为什么我要使用缓冲区指针而不是向量等。这只是一个可重现的示例,请理解在实际代码中我受到限制这些实施选择。现在,我不再假设我只是犯了一些简单的错误,例如在引用/取消引用指针时混淆了语法。
创建一个映射,其中每个值都是固定大小的缓冲区
那不是你在做的事。这是您忘记的一项测试:
std::cout << sizeof(SP[0]); // How large is the actual element of the map?
这是一个映射,其中每个值都是固定大小的缓冲区:
std::map<int, std::array<hdr, 20>> SP;