2017-04-04 176 views
0

使用C99我试图在函数中做到这一点:C结构数组初始化铸造

foo_t foos[4]; 
foos[0] = {1, {1,2}}; 

不起作用。所以我试了这个...

foo_t foos[4]; 
foos[0] = (foo_t){1, {1,2}}; 

哪个有效,但是安全吗?有没有更好的方法来做到这一点?

+0

如果你告诉我们foo_t的定义是什么,这将有所帮助。 – ScottK

+0

你可以这样做:'foo_t foos [4] = {{1,{1,2}}};'。虽然这不完全等同于你已经显示的,因为它不是初始化索引1-3的元素,而你的例子没有。 – kaylum

+0

在实际的代码中,foos []数组位于一个更大的结构数组中(并且内部包含更多的低级结构),所以我不能在声明期间执行一次赋值,因为结果过多的嵌套会使整个桌子一团乱七八糟。 – user2418731

回答

0

第一种情况失败了,因为没有类型与表达式(括号内的初始化)

是的,第二代码是安全相关联,只要初始化列表的预期类型的​​LHS匹配。这称为compound literal,FWIW。

引用C11,章§6.5.2.5

,它由一个括号类型名称后面初始化的一支柱封闭 列表的后缀表达式是字面的化合物。它提供了一个未命名的对象,其值由初始化程序列表给出。