所以我有以下内容:
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?
并更改了我的代码(上图),但我仍然收到错误。
我仍然一无所知,我已经用另一种方式解决了我的问题,但好奇心我想知道它是如何完成的,就像上一篇文章一样,我知道这是可能的。
答案 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
。