【问题标题】:C - Change all values of an array of structures in one lineC - 在一行中更改结构数组的所有值
【发布时间】:2010-11-16 11:04:21
【问题描述】:

我可以声明一个结构:

typedef struct
{
  int var1;
  int var2;
  int var3;
} test_t;

然后使用默认值创建这些结构结构的数组:

test_t theTest[2] =
{
   {1,2,3},
   {4,5,6}
};

但是在我创建了数组之后,有没有什么方法可以像我上面所做的那样更改值,只使用一行,明确指定每个值而无需循环?

【问题讨论】:

    标签: c arrays initialization structure


    【解决方案1】:

    我认为不可以,您只能通过这种方式初始化数组。 但是您可以使用“单行”方法更改结构的值

    【讨论】:

    • 您的意思是“无法更改值”吗?另请参阅提到 C99 的答案。
    • 对不起,我只使用 -c99 并没有提及。我经常使用这个功能:“theTest[0] = (test_t){7,8,9};”
    【解决方案2】:

    如果变量是从其他来源复制的,您可以使用 memcpy 之类的方法直接覆盖结构值。

    但是,除了设置单个元素之外,该语言没有提供直接设置值的方法。

    【讨论】:

      【解决方案3】:

      如果您想将值设置为零(或-1),您可以使用memset

      memset(struct_array, 0, sizeof(struct_array));
      memset(struct_array, -1, sizeof(struct_array));
      

      【讨论】:

      • 是的,但不是很完整。你忘记了 C99。
      • 我刚刚提到这是针对问题的常见特殊情况的替代方法。我没有声称它解决了全部问题。
      【解决方案4】:

      在 C99 中,您可以在一行中分配每个结构。我不认为你可以在一行中分配结构数组。

      C99 引入了复合文字。在此处查看 Dobbs 博士的文章:The New C: Compound Literals

      theTest[0] = (test_t){7,8,9};
      theTest[1] = (test_t){10,11,12};
      

      你可以像这样赋值给一个指针:

      test_t* p; 
      p = (test_t [2]){ {7,8,9}, {10,11,12} };
      

      你也可以使用 memcpy:

      memcpy(theTest, (test_t [2]){ {7,8,9}, {10,11,12} }, sizeof(test_t [2]);
      

      以上在 linux 上使用 gcc -std=c99(版本 4.2.4)测试。

      您应该阅读 Dobbs 博士的文章以了解复合文字的工作原理。

      【讨论】:

      • 这样,您可以为赋值循环创建一个宏。这样,它很容易重复使用并且非常干净。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2020-05-23
      • 2019-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多