对于像
这样的结构struct data{
int a;
int b;
int c;
};
如何一次初始化具有相同值的该结构的多个实例?
而不是:
struct data object1 = {0,0,0}, object2 = {0,0,0}, object3 = {0,0,0};
答案 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));