我有一个四维静态数组
#define MAX_NUM 64
unsigned char Stamps[MAX_NUM][16][16][3];
每一行(即Stamps[MAX_NUM][][][]
)代表从图像裁剪的RGB补丁。
我该如何使用memcpy
将Stamps
中的一行复制到动态数组中:
unsigned char *DynArr = new unsigned char [16 * 16 * 3];
像这样:
std::memcpy(DynArr, Stamps[row], sizeof Stamps[row]);
&Stamps[row]
作为源。 - jxh&Stamps[row]
非常具有误导性,也许应该改为&Stamps[row][0]
。 - HoltFoo
数组,那么将一个 Foo
复制到一个 char [sizeof(Foo)]
中,我会使用 &array[i]
。在这种情况下,typedef char Foo[16][16][3];
。 - jxh把这个问题想象成有一个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
是非数组类型,则需要使用取地址符。
std::memcpy
就足够了。 - Holtint [100] [100]
复制“某些内容”到int [10] [10]
的问题。我甚至无法理解它是关于复制一行然后将其重塑为10x10,还是关于复制子矩阵...这个问题要简单得多,因为它基本上是复制Stamps
的一行并将其展平...而且由于布局是连续的,所以基本上是std::memcpy(DynArr, Stamps[istamp], sizeof *Stamps);
。 - Holtunsigned char (*DynArr)[16][3] = new unsigned char[16][16][3];
只要内部维度的大小是编译时常量(16
和3
),外部维度大小(这里也是16
)可以在运行时提供,并且在DynArr
类型中被省略。 - cmaster - reinstate monica