如何将数组的一部分从2d数组复制到C中的另一个数组中

时间:2013-05-27 20:07:51

标签: c arrays multidimensional-array memcpy

所以我有以下内容:

int from[2][3] = { {1,2,3}, {2,3,4} };
int into[3];

into = memcpy(into, from[0], 3 * sizeof(*into));

我想将'from'复制到数组'into',以便'into'= {1,2,3}

我正在尝试使用memcpy执行上述操作(我知道它已经可以使用循环)但我似乎无法让它工作。

我一直在收到错误:

error: incompatible types when assigning to type ‘int[3]’ from type ‘void *’

我找到了这个问题的链接:

How do I copy a one-dimensional array to part of another two-dimensional array, and vice-versa?

并更改了我的代码(上图),但我仍然收到错误。

我仍然一无所知,我已经用另一种方式解决了我的问题,但好奇心我想知道它是如何完成的,就像上一篇文章一样,我知道这是可能的。

2 个答案:

答案 0 :(得分:3)

正如KingsIndian指出的那样,你可以通过删除赋值来避免这个问题,因为在这个实例中你实际上并不需要返回值。然而,未来可能有助于了解幕后发生的事情:

memcpy将指针返回到目标位置。如果“into”是一个指针,那就没问题了:

int from[2][3] = { {1,2,3}, {2,3,4} };
int into[3];
int *into_ptr = into;

into_ptr = memcpy(into_ptr, from[0], 3 * sizeof(int)); // OK

问题是“into”是一个数组,而不是一个指针。 C中的数组不是变量,即它们不能分配,因此错误。虽然经常说数组和指针是等价的,但是存在差异,这是一个。这里给出了关于数组和指针之间差异的更多细节:

http://eli.thegreenplace.net/2009/10/21/are-pointers-and-arrays-equivalent-in-c/

修改

要通过不执行任何分配来完全避免此问题,请忽略返回值:

int from[2][3] = { {1,2,3}, {2,3,4} };
int into[3];

memcpy(&into[0], from[0], sizeof(into));

答案 1 :(得分:2)

memcpy返回指向您尝试分配给数组的目标的指针。您可以忽略memcpy的返回值。

   #include <string.h>

   void *memcpy(void *dest, const void *src, size_t n);

你可能想要的是:

memcpy(into, from[0], sizeof into);

这会将每个4字节的3个元素(此处sizeof into == 12)从from[0]复制到into