【问题标题】:Copy N-D array in C++ using memcpy使用 memcpy 在 C++ 中复制 A-N-D 数组
【发布时间】:2020-02-24 22:17:35
【问题描述】:

我有一个 4-D 静态数组

#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 我发布了两个不同的链接。如果你的意思是第一个,是的,我同意。第二个(我实际上标记为重复的那个)似乎更清楚。
  • @FedericoklezCulloca 我实际上指的是第二个。这是关于将“某物”从int[100][100] 复制到int[10][10]。我什至无法理解它是关于复制一行然后将其重塑为 10x10,还是关于复制子矩阵...这个问题要简单得多,因为它基本上是复制一行 Stamps 并将其展平。 .而且由于布局是连续的,所以基本上是std::memcpy(DynArr, Stamps[istamp], sizeof *Stamps);
  • @Holt 我完全误读了链接的副本。删除两个链接。
  • 顺便说一句,副本也可以是 3D 数组:unsigned char (*DynArr)[16][3] = new unsigned char[16][16][3]; 只要内部维度的大小是编译时常量(163),外部维度大小(这里也是16)可以在运行时提供,并从DynArr的类型中省略。

标签: c++ memcpy


【解决方案1】:

像这样:

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

【讨论】:

  • 我可能仍会使用&Stamps[row] 作为源,即使数组衰减导致相同的指针值...
  • @jxh 如果个人觉得&Stamps[row]很误导,可能是&Stamps[row][0]
  • 如果我有一个Foo 数组,那么要将Foo 复制到char [sizeof(Foo)],我会使用&array[i]。在这种情况下,typedef char Foo[16][16][3];.
  • @jxh 是的,我想这在我看来同样有意义。地址相同的时候无所谓,反正指针会被重新解释。
  • @Holt:我在单独的答案中解释了我的推理。
【解决方案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 是一个 3-D 数组。

typedef unsigned char Foo[16][16][3];

@eeroika's answer 工作正常,因为当Foo 是一个数组时,它的一个实例将衰减到等于其第一个元素的地址的值。对于数组,其第一个元素的地址与数组本身的地址相同。但是,如果 Foo 是非数组类型,则需要使用 address-of 运算符。

【讨论】:

    猜你喜欢
    • 2017-11-13
    • 1970-01-01
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多