我遇到了以下结构:
static struct {
unsigned char a[5];
} b[] = {
{1,1,1,1,1},
{2,2,2,2,2}
};
但是,如果正在编译它,则会收到以下警告“警告:初始化程序[-Wmissing-braces]周围缺少花括号”。
如果我这样修改它:
static struct {
unsigned char a[5];
} b[] = {
{{1,1,1,1,1}},
{{2,2,2,2,2}}
};
然后该警告消失了。在“ b [] =”之后,每个花括号代表什么? 最里面的花括号显然是吗?代表char a [5]的初始化。但是其他括号代表什么呢?明显?其他花括号之一必须说明结构数组b [],但是哪一个呢?为何似乎需要第三根大括号呢?它代表什么呢?这使我感到困惑。
答案 0 :(得分:5)
int a[2] = { 1, 2 };
好的。现在这个:
int a[2][2] = { { 1, 2 } , { 3, 4 } };
对吗? a[0][0] = 1
和a[0][1] = 2
以及a[1][0] = 3
和a[1][1] = 4
。 a[0]
等于(int[]){ 1, 2 }
的memcmp,而a[1]
等于(int[]){ 3, 4 }
的memcmp。
现在,这个:
struct {
int a[2];
} b = { { 1, 2 } };
因此,第一个{
}
代表结构初始化,内部代表b.a
初始化。现在我们构造一个结构数组:
struct b_s {
int a[2];
} b[] = {
{
{ 1, 2 },
},{
{ 3, 4, }
},
};
因此,第一个花括号代表数组b[]
的初始化。第二个用于初始化结构b[0]
。第三个是初始化b[0].a
数组。
b[0]
等于&(struct b_s){ {1, 2 } }
。 b[0].a
的内存等于(int[2]){ 1, 2 }
。 b[0].a[0]
等于1
。
答案 1 :(得分:1)
每个括号对应一个子对象(聚合对象内部的对象,例如数组或结构)的开始。
b[]
是一个数组,因此第一个花括号介绍了数组的元素。
每个b
是一个结构,因此下一个花括号介绍了该结构的成员。
a
中的成员b
是一个数组,因此下一个花括号介绍了该数组的元素。
答案 2 :(得分:1)
{1,1,1,1,1}
-数组的五个元素。
{{1,1,1,1,1}}
-在这种情况下,您就是用一个包含五个int
的数组的字段初始化结构的。
{{{1,1,1,1,1}}, {{2,2,2,2,2}}}
-这是一个由两个元素组成的数组。每个元素都是上述结构的实例。
答案 3 :(得分:0)
您有一个结构的结构,其中包含数组。三对大括号。
答案 4 :(得分:0)
static struct {
unsigned char a[5];
} b[] = { // array b
{ // struct
{ // array a
1,1,1,1,1}},
{ // another struct
{2,2,2,2,2}}
};