2017-04-04 121 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

,它由一個括號類型名稱後面初始化的一支柱封閉 列表的後綴表達式是字面的化合物。它提供了一個未命名的對象,其值由初始化程序列表給出。