Что означает каждая фигурная скобка при объявлении / инициализации структуры? (предупреждение: отсутствуют фигурные скобки вокруг инициализатора [-wmissing-braces])

Я наткнулся на такую ​​структуру:

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 [], но какую? А зачем, кажется, нужна третья фигурная скобка и для чего она нужна? Это меня смущает.

1
0
86
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

У вас есть множество из структуры, содержащий массивы. Три пары подтяжек.

Каждая фигурная скобка соответствует началу подобъекта (объекта внутри совокупного объекта, такого как массив или структура).

b[] - это массив, поэтому первая фигурная скобка вводит элементы массива.

Каждый b представляет собой структуру, поэтому следующая фигурная скобка вводит элементы структуры.

Элемент a внутри b является массивом, поэтому следующие фигурные скобки вводят элементы этого массива.

Ответ принят как подходящий
int a[2] = { 1, 2 };

Ok. Теперь это:

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] - это memcmp, равное (int[]){ 1, 2 }, а a[1] - это memcmp, равное (int[]){ 3, 4 }.

Теперь это:

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] - это memcmp, равный &(struct b_s){ {1, 2 } }. b[0].a - это memcmp, равный (int[2]){ 1, 2 }. b[0].a[0] эквивалентен 1.

{1,1,1,1,1} - пять элементов массива.

{{1,1,1,1,1}} - вот как вы инициализируете структуру с полем, которое в данном случае представляет собой массив из пяти int.

{{{1,1,1,1,1}}, {{2,2,2,2,2}}} - это массив из двух элементов. Где каждый элемент является экземпляром структуры, как указано выше.

static struct {
    unsigned char a[5];
} b[] = {                 // array b
        {                 // struct
        {                 // array a
          1,1,1,1,1}},
        {                 // another struct
        {2,2,2,2,2}}
};

Другие вопросы по теме