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

use*_*317 1 c struct

我遇到了以下结构:

static struct {
    unsigned char a[5];
} b[] = {       
        {1,1,1,1,1},
        {2,2,2,2,2}
};
Run Code Online (Sandbox Code Playgroud)

但是,如果正在编译,我会收到以下警告"警告:在初始化程序[-Wmissing-braces]周围缺少大括号".

如果我改变它:

static struct {
    unsigned char a[5];
} b[] = {       
        {{1,1,1,1,1}},
        {{2,2,2,2,2}}
};
Run Code Online (Sandbox Code Playgroud)

然后警告消失了.在"b [] ="之后,每个大括号代表什么?最里面的花括号显然是?代表char a [5]的初始化.但其他支撑是什么?明显?其他一个花括号必须考虑结构数组b [],但哪一个?为什么会出现第三个大括号,它代表什么呢?这让我很困惑.

Kam*_*Cuk 5

int a[2] = { 1, 2 };
Run Code Online (Sandbox Code Playgroud)

好.现在这个:

int a[2][2] = { { 1, 2 } , { 3, 4 } };
Run Code Online (Sandbox Code Playgroud)

对?a[0][0] = 1a[0][1] = 2a[1][0] = 3a[1][1] = 4.a[0]memcmp等于(int[]){ 1, 2 }并且a[1]memcmp等于(int[]){ 3, 4 }.

现在这个:

struct {
     int a[2];
} b = { { 1, 2 } };
Run Code Online (Sandbox Code Playgroud)

所以{ }结构初始化的第一个立场和初始化的内部立场b.a.现在我们创建一个结构数组:

struct b_s {
     int a[2];
} b[] = { 
      {
         { 1, 2 },
      },{ 
         { 3, 4, }
      },
};
Run Code Online (Sandbox Code Playgroud)

所以第一个括号代表数组b[]初始化.第二个是用于b[0]初始化的结构.第三个是初始化b[0].a数组.

b[0]是memcmp等于&(struct b_s){ {1, 2 } }.该b[0].a是memcmp等于(int[2]){ 1, 2 }.该b[0].a[0]等于1.