【问题标题】:How to copy part of an array from a 2d array into another array in C如何将数组的一部分从二维数组复制到C中的另一个数组中
【发布时间】:2013-05-27 20:07:50
【问题描述】:

所以我有以下内容:

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 *’

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

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

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

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

【问题讨论】:

    标签: c arrays multidimensional-array memcpy


    【解决方案1】:

    正如 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));
    

    【讨论】:

    • 谢谢,这很有效,也很有意义!我可以在不需要 int into[3] 和 int *into_ptr 的情况下再添加一个问题。这听起来有点傻所以我不去,但我的意思是我需要指向数组的指针还是我可以用数组来做(我猜它存储在其他东西中)所以我不需要额外的变量....冗长的问题,我希望你能理解我
    • 您确实需要声明数组,因为如果您只有一个指针,您将需要独立分配内存。但是,如果您忽略 KingsIndian 回答的返回值,则可以消除指针。
    • 我没有得到它与 KingsIndian 的答案一起使用......也许我误读/理解了他的意思/你的意思是代码的哪些部分发生了变化
    • 答案更新了完整的代码,无需中间指针。
    • 感谢工作.. 我知道 memcpy(into, ... 也可以工作,因为它与 &into[0]
    【解决方案2】:

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

       #include <string.h>
    
       void *memcpy(void *dest, const void *src, size_t n);
    

    你可能想要的是:

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

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

    【讨论】:

    • 解释一下为什么可以扔掉返回值。
    • @djechlin:RTFM。 “返回值 memcpy() 函数返回一个指向 dest 的指针。”
    • @thejh 老兄。我知道如何阅读手册。我也知道 C。包含在答案中是很好的信息。不知道 memcpy 是如何工作的人可能正在学习 C 的过程中,并且真的不应该留下这样的印象,即在一半的时间里扔掉/忽略返回值是可以的。大多数返回值告诉您函数是否成功。 memcpy 是一个例外,它会是一个改进的答案来说明原因。
    • 我尝试了上述方法,它仍然无法正常工作。函数'main':test.c:9:8:错误:从类型'void *'分配给类型'int [3]'时类型不兼容
    • @user2426194 我认为您正在尝试将 memcpy() 的返回值分配给into
    猜你喜欢
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    相关资源
    最近更新 更多