声明/初始化结构时,每个花括号代表什么? (警告:初始化程序[-Wmissing-braces]周围缺少括号)

时间:2018-10-31 11:50:36

标签: c struct

我遇到了以下结构:

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 [],但是哪一个呢?为何似乎需要第三根大括号呢?它代表什么呢?这使我感到困惑。

5 个答案:

答案 0 :(得分:5)

int a[2] = { 1, 2 };

好的。现在这个:

int a[2][2] = { { 1, 2 } , { 3, 4 } };

对吗? a[0][0] = 1a[0][1] = 2以及a[1][0] = 3a[1][1] = 4a[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}}
};