如何一次初始化几个struct变量?

时间:2016-12-30 12:00:46

标签: c arrays struct initialization

对于像

这样的结构
struct data{
   int a;
   int b;
   int c;
};

如何一次初始化具有相同值的该结构的多个实例?

而不是:

struct data object1 = {0,0,0}, object2 = {0,0,0}, object3 = {0,0,0};

4 个答案:

答案 0 :(得分:4)

您可以使用struct的数组并使用单个大括号括起的初始值设定项,例如

 struct data object [3] = {0};

拥有该结构类型的多个变量,全部初始化为0(或等效)。

这使用初始化的特殊属性,引用C11,章节

  

初始化应在初始化器列表顺序中进行,每个初始化器提供给a   特定子对象覆盖同一子对象的任何先前列出的初始化程序; 151)   所有未明确初始化的子对象都应隐式初始化为   具有静态存储持续时间的对象。

并初始化具有static存储空间的对象

  

[...]如果没有初始化具有静态或线程存储持续时间的对象   明确地说:

     

- 如果它有指针类型,则将其初始化为空指针;

     

- 如果它有算术类型,则初始化为(正或无符号)零;

     

- 如果是聚合,则根据这些规则初始化(递归)每个成员,   并且任何填充都被初始化为零位;

     

- 如果是联合,则根据这些初始化(递归)第一个命名成员   规则,任何填充都初始化为零位;

也就是说,如果您不希望将所有值初始化为0,则可以采用其他方式。正如Jonathon Reinhart先生在other answer中所提到的,您可以使用指定的初始化器。

答案 1 :(得分:4)

首先,我倾向于支持Linux内核风格,并且非常喜欢designated initializers

我会做他们做的事情,并创建一个用于初始化结构的宏。这样可以轻松添加元素并控制它们的初始化方式。

var array1 = [{"value":"A","id":1},{"value":"B","id":1},{"value":"C","id":2},{"value":"B","id":5},{"value":"A","id":2},{"value":"A","id":1}]

var result = [];
array1.forEach(function(e) {
  if(!this[e.value]) (this[e.value] = {group: e.value, groupIds: []}) && result.push(this[e.value])
  this[e.value].groupIds = [...new Set(this[e.value].groupIds.concat(e.id))]
}, {})

console.log(result)

并像这样使用它:

struct data {
   int a;
   int b;
   int c;
};

#define INIT_DATA { \
    .a = 0, \
    .b = 0, \
    .c = 0, \
}

继续使用Linux风格,无论如何你都不会有多个变量。添加/删除变量时,更容易看到它们。有什么问题:

struct data mydata = INIT_DATA;

如果你有一对以上,它们应该是个体变量还是阵列?如果是这样,您可以利用GNU扩展来初始化范围:

struct data old_data = INIT_DATA;
struct data new_data = INIT_DATA;

否则,您将需要使用常规旧循环在运行时初始化数据。

答案 2 :(得分:3)

  

如何一次初始化具有相同值的该结构的多个实例?

不是真的" 一次",无论这是什么意思,但至少不重复自己(即the DRY-principal之后)你可以这样做:

int main(void)
{
  struct data object1 = {1, 2, 3}, object2 = object1, object3 = object1;

  ...
}

或在单独的一行中使用每个定义:

int main(void)
{
  struct data object1 = {1, 2, 3};
  struct data object2 = object1;
  struct data object3 = object1;

  ...
}

答案 3 :(得分:0)

创建一个结构数组并在循环中初始化它们。

struct data array[N_ITEMS];

for(i=0; i<N_ITEMS; i++)
{
    array[i].a=a;
    array[i].b=b;
    array[i].c=c;
}

如果要将所有字段初始化为0,可以使用memset:

 memset(array, 0, sizeof(array));