【问题标题】:Cannot assign an array to another无法将数组分配给另一个数组
【发布时间】:2012-06-02 13:08:55
【问题描述】:

我尝试通过不同的方式将数组指针复制到另一个数组指针,但没有成功。 这是我的尝试,以及相关的错误消息。

typedef long int coordinate;
typedef coordinate coordinates[3];

void test(coordinates coord) {
    coordinates coord2 = coord; // error: invalid initializer
    coordinates coord3;
    coord3 = coord; // error: incompatible types when assigning to type ‘coordinates’ from type ‘long int *’
    coord3 = (coordinates) coord; // error: cast specifies array type
    coord3 = (coordinate[]) coord; // error: cast specifies array type
    coord3 = (long int*) coord; // error: incompatible types when assigning to type ‘coordinates’ from type ‘long int *’
}

我知道我可以改用typedef coordinate* coordinates;,但它对我来说不是很明确。

【问题讨论】:

    标签: c


    【解决方案1】:

    您不能在 C 中分配数组。使用memcpy 将一个数组复制到另一个数组中。

    coordinates coord2;
    
    memcpy(coord2, coord, sizeof coord2);
    

    【讨论】:

    • 起初,我在寻找一种方法来保持相同的数据,但只复制指针。但是,现在看起来复制数据显然更好。感谢您的提示和代码。
    • @valentinLorentz 当然,如果您不需要复制数据,使用指针会更有效。
    【解决方案2】:

    当数组按值传递时,它们是decay to pointers。解决这个问题的常见技巧是将固定大小的数组包装在 struct 中,如下所示:

    struct X {
        int val[5];
    };
    
    struct X a = {{1,2,3,4,5}};
    struct X b;
    b = a;
    for(i=0;i!=5;i++)
        printf("%d\n",b.val[i]);
    

    现在您可以将包装后的数组按值传递给函数、分配它们等等。

    【讨论】:

      【解决方案3】:

      你的坐标需要初始化为指针

      coordinates *coords2, *coords3;

      尝试一下然后分配。

      【讨论】:

      • 但这实际上不会复制数据。
      • 是的,这将是一个分配给同一个数组的指针@ouah对此有更好的答案
      【解决方案4】:

      您不能使用赋值运算符将一个数组分配给另一个数组,例如a = b,因为数组不知道自己的大小。

      这就是为什么我们不能使用赋值运算符将一个数组分配给另一个数组的原因。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-14
        • 2018-09-03
        • 2018-08-22
        • 2013-09-28
        相关资源
        最近更新 更多