在C语言中,如何将数组的一部分从二维数组复制到另一个数组中

在C语言中,如何将数组的一部分从二维数组复制到另一个数组中,c,arrays,multidimensional-array,memcpy,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'in'复制到数组'into'中,这样'into'就等于{1,2,3} 我正在尝试使用memcpy来完成上面的工作(我知道它已经和一个循环一起工作了),但是我似乎无法让它工作 我不断发现错误: error: incompatible types when

因此,我有以下几点:

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

into = memcpy(into, from[0], 3 * sizeof(*into));
我想把'from'in'复制到数组'into'中,这样'into'就等于{1,2,3}

我正在尝试使用memcpy来完成上面的工作(我知道它已经和一个循环一起工作了),但是我似乎无法让它工作

我不断发现错误:

error: incompatible types when assigning to type ‘int[3]’ from type ‘void *’
我找到了这个问题的链接:

并更改了我的代码(如上),但我仍然得到了错误


我仍然不知道,我已经用另一种方式解决了我的问题,但好奇的是,我想知道它是如何完成的,因为从上一篇文章中我知道这是可能的。

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

   #include <string.h>

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

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

正如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中的数组不是变量,也就是说,它们不能被赋值,因此会出现错误。虽然人们常说数组和指针是等价的,但它们之间还是有区别的。有关数组和指针之间差异的更多详细信息,请参见:

编辑:

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

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

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

解释为什么可以丢弃返回值。@djechlin:RTFM。“返回值memcpy()函数返回指向dest的指针。”@thejh dude。我知道如何阅读手册。我也知道C。答案中包含的信息很好。一些不知道memcpy如何工作的人可能正在学习C语言,因此不应该给人留下这样的印象,即一半时间都可以丢弃/忽略返回值。大多数返回值告诉您函数是否成功。memcpy是一个例外,它是一个更好的答案来说明原因。我尝试了上面的方法,但仍然不起作用。函数“main”:test.c:9:8:错误:当从类型“void*”分配给类型“int[3]”时,类型不兼容@user2426194我认为您试图将memcpy()的返回值分配给
。谢谢,这也很有效!还有一个附加问题,我可以不需要将int放入[3]和int*放入\u ptr。这听起来有点傻,所以我要用no,但我的意思是,我需要指向数组的指针,还是可以用数组(我想可以将它存储在其他东西中)来实现它,所以我不需要额外的变量。。。。冗长的问题我希望你理解我,你确实需要声明数组,因为如果你只有一个指针,你需要独立分配内存。但是,如果忽略每个KingsIndian的答案的返回值,指针可以被消除。我没有得到它与KingsIndian的答案一起工作。。。也许我误读了/理解了他的意思/你怎么理解代码更改的哪些部分答案更新了完整的代码,没有中间指针。。我知道memcpy(into,…)也可以工作,因为它与&into[0]相同
int from[2][3] = { {1,2,3}, {2,3,4} };
int into[3];

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