Массив инициализации структуры до 0 в C, предупреждение: отсутствующие фигурные скобки вокруг инициализатора
Пример кода:
#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 без предупреждения компилятора? Благодарю.
Для начала есть опечатка. Вы забыли разместить точку с запятой после последнего члена данных структуры, и либо вы будете использовать запятые для разделения деклараторов (то есть вам нужно удалить спецификаторы типов до 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 } };
Тем не менее ваша декларация верна.
Единственная проблема с вашим кодом заключается в том, что вам нужна точка с запятой ;
вместо того ,
после каждого элемента структуры.
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
в своем коде.
Самый простой способ сделать это - использовать memset. Вы можете гарантировать, что это очистит массив и все элементы структуры. См. Пример ниже:
memset(arr, 0, sizeof(arr));