Массив инициализации структуры до 0 в C, предупреждение: отсутствующие фигурные скобки вокруг инициализатора

74
7

Пример кода:

#include <stdio.h>

typedef struct
{
unsigned int a,
unsigned int b,
unsigned int c
} user_struct;

int main()
{
user_struct arr[5] = {0}; // gives warning on compilation
return 0;
}

Вышеприведенный код дает предупреждения в gcc5.4. Ниже приведено предупреждение.

предупреждение: отсутствующие фигурные скобки вокруг инициализатора

Я понимаю, что если я хочу инициализировать любой объект до 0, я могу просто приравнять к {0}.

Как я могу инициализировать массив структур до 0 без предупреждения компилятора? Благодарю.

спросил(а) 2016-12-09T03:08:00+03:00 4 года, 2 месяца назад
1
Решение
61

Для начала есть опечатка. Вы забыли разместить точку с запятой после последнего члена данных структуры, и либо вы будете использовать запятые для разделения деклараторов (то есть вам нужно удалить спецификаторы типов до b и c), либо использовать точки с запятой для разделения объявлений данных.

typedef struct
{
unsigned int a,
unsigned int b,
^^^^^^^^^^^^
unsigned int c
^^^^^^^^^^^^ ^^^
} user_struct;

Например, вы могли бы написать

typedef struct
{
unsigned int a;
unsigned int b;
unsigned int c;
} user_struct;

Что касается предупреждения, то это выражение

user_struct arr[5] = {0};    

объявляет совокупность агрегатов, которая представляет собой массив структур. Предполагается, что агрегаты инициализируются скобками, заключенными в скобки. Это упрощает инициализацию агрегатов. Поэтому компилятор ожидает, что вы напишете

user_struct arr[5] = { { 0 } };

Тем не менее ваша декларация верна.

ответил(а) 2016-12-09T03:53:00+03:00 4 года, 2 месяца назад
61

Единственная проблема с вашим кодом заключается в том, что вам нужна точка с запятой ; вместо того , после каждого элемента структуры.

    typedef struct
{
unsigned int a;
unsigned int b;
unsigned int c;
} user_struct;

Ваша инициализация в порядке:

user_struct arr[5] = {0};  // this should memset all array elements (here struct) to zero

Предупреждение, если оно есть, только то, что вы инициализировали, но никогда не использовали arr в своем коде.

ответил(а) 2016-12-09T03:12:00+03:00 4 года, 2 месяца назад
43

Самый простой способ сделать это - использовать memset. Вы можете гарантировать, что это очистит массив и все элементы структуры. См. Пример ниже:

memset(arr, 0, sizeof(arr));

ответил(а) 2016-12-09T04:07:00+03:00 4 года, 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема