在C++中使用memcpy复制N维数组

3

我有一个四维静态数组

#define MAX_NUM 64
unsigned char Stamps[MAX_NUM][16][16][3];

每一行(即Stamps[MAX_NUM][][][])代表从图像裁剪的RGB补丁。

我该如何使用memcpyStamps中的一行复制到动态数组中:

unsigned char *DynArr = new unsigned char [16 * 16 * 3];


@FedericoklezCulloca 这个重复问题写得相当糟糕,我认为(即使有这些答案,我甚至无法清楚地理解问题...)它涉及到一个更复杂的问题。在这里,单个std::memcpy就足够了。 - Holt
@Holt 我发布了两个不同的链接。如果你指的是第一个,是的,我同意。第二个链接(我实际标记为重复的那个)似乎更清晰明了。 - Federico klez Culloca
@FedericoklezCulloca,我实际上是在指第二个。这是关于从int [100] [100]复制“某些内容”到int [10] [10]的问题。我甚至无法理解它是关于复制一行然后将其重塑为10x10,还是关于复制子矩阵...这个问题要简单得多,因为它基本上是复制Stamps的一行并将其展平...而且由于布局是连续的,所以基本上是std::memcpy(DynArr, Stamps[istamp], sizeof *Stamps); - Holt
@Holt 我完全误读了链接的重复内容。删除两个链接。 - Federico klez Culloca
顺便提一下,副本也可以是3D数组:unsigned char (*DynArr)[16][3] = new unsigned char[16][16][3]; 只要内部维度的大小是编译时常量(163),外部维度大小(这里也是16)可以在运行时提供,并且在DynArr类型中被省略。 - cmaster - reinstate monica
2个回答

4

像这样:

std::memcpy(DynArr, Stamps[row], sizeof Stamps[row]);

即使数组衰减会产生相同的指针值,我可能仍然会使用&Stamps[row]作为源。 - jxh
@jxh 如果我个人来说,觉得&Stamps[row]非常具有误导性,也许应该改为&Stamps[row][0] - Holt
如果我有一个 Foo 数组,那么将一个 Foo 复制到一个 char [sizeof(Foo)] 中,我会使用 &array[i]。在这种情况下,typedef char Foo[16][16][3]; - jxh
@jxh 是的,我认为这在我的意见中同样有意义。当地址相同时并且指针无论如何都会被重新解释时,这并不重要。 - eerorika
@Holt:我在另一个答案中解释了我的推理。 - jxh
显示剩余3条评论

2

把这个问题想象成有一个Foo的数组。

#define MAX_NUM 64
Foo Stamps[MAX_NUM];

现在你想要复制一个Foo

unsigned char *DynArr = new unsigned char[sizeof(Foo)];
std::memcpy(DynArr, &Stamps[row], sizeof(Stamps[row]));

这适用于任何类型的Foo。在你的情况下,Foo是一个三维数组。
typedef unsigned char Foo[16][16][3];

@eeroika的回答是正确的,因为当Foo是一个数组时,它的实例会衰减为与其第一个元素的地址相等的值。对于数组来说,其第一个元素的地址与该数组本身的地址相同。但是,如果Foo是非数组类型,则需要使用取地址符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接