【问题标题】:Assigning an array to a struct member in C [duplicate]将数组分配给C中的结构成员[重复]
【发布时间】:2014-02-23 20:13:32
【问题描述】:

这段代码是我写的

#include <stdio.h>

struct foo
{
    int foo1[3];
};

int main(void)
{
    int a[] = {1, 2, 3};
    struct foo test;
    test.foo1 = a;
    printf("%d\n", test.foo1[0]);

    return 0;
}

它给出编译错误,说它不能将 int * 转换为 int[3]。

我知道数组名称会衰减为表达式中的指针,但有没有办法抑制这种情况,因为我确实需要一个数组?

【问题讨论】:

  • test.foo1=a;memcpy(test.foo1, a, sizeof(test.foo1));
  • 你可以写struct foo test = { {1,2,3} };

标签: c arrays pointers


【解决方案1】:

正如其他人所说,没有可以复制数组的直接赋值运算符。你必须改用memcpy()

memcpy(test.foo1, a, sizeof(a));

这是 C 语言中的错误来源之一,因为 sizeof() 需要足够大以复制所有数据,但又不能太大,以免覆盖 tests.foo1 处的数据。我想,最好的做法是在执行memcpy() 之前测试两个数组的大小是否相同。

【讨论】:

    【解决方案2】:

    这是C的基础之一,数组不能赋值。

    【讨论】:

    • 我认为 copyed 会是一个更好的词。
    • @ajay,无论好坏,赋值 C 中的技术术语。 (也许您正在考虑 C++ 复制运算符?另一种语言。)顺便说一句,使用 memcpy 时可以复制数组。
    • int a = 4; int b; b = a; 复制的意思是最后一条语句复制a的内容到b。还是说a 分配给b
    • @ajay,后者。在 C 中,= 是赋值运算符。
    【解决方案3】:

    在 C 和 C++ 中,无法为整个数组赋值。也不能将另一个数组的值分配给一个数组(即使维度匹配)。

    【讨论】:

      【解决方案4】:

      您不能在 C 中分配数组。但是,您可以分配用户定义类型的对象,即使这些对象包含数组。所以 peraps 像这样重写它:

      struct foo a = { { 1, 2, 3 } };
      
      struct foo test;
      test = a;
      

      当然也可以立即正确初始化对象:

      struct foo test = { { 1, 2, 3 } };
      

      【讨论】:

        【解决方案5】:

        数组不是C 中的第一类对象。您不能复制(分配)、比较、传递或返回数组。您将一个数组逐个元素复制到另一个数组中。您还可以逐个元素地比较两个数组。您将指针传递给数组的第一个元素,并类似地返回一个指向动态分配数组的第一个元素的指针。因此test.foo1 = a; 是错误的。你有两个选择。

        #include <stdio.h>
        
        struct foo {
            int foo1[3];
        };
        
        int main(void) {
            int a[] = {1, 2, 3};
            struct foo test;
            int len = *(&(test.foo1) + 1) - test.foo1; // length of the array test.foo1
            int i = 0;
            for(i = 0; i < len; i++)
                test.foo1[i] = a[i];  // copy the array element-wise
        
            printf("%d\n", test.foo1[0]);
            return 0;
        }
        

        您也可以使用memcpy直接将数组amain中的所有字节复制到数组test.foo1中。

        memcpy(test.foo1, a, sizeof a);
        

        这会将数组a 的所有字节复制到数组test.foo1 中。因此数组test.foo1 必须足够大,否则会导致未定义的行为甚至段错误。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-12-26
          • 2011-05-24
          • 1970-01-01
          • 1970-01-01
          • 2022-01-02
          • 2020-03-09
          • 1970-01-01
          相关资源
          最近更新 更多