Как инициализировать массив структур с? - PullRequest
3 голосов
/ 19 декабря 2011
struct SampleStruct {
   int a;
   int b;
   float c;
   double d;
   short e;       
};

Для такого массива я использовал его для инициализации, как показано ниже:

struct SampleStruct sStruct = {0};

Я хотел бы знать, когда я объявляю массив этой структуры, я думал, что это будет правильно

struct SampleStruct sStructs[3] = {{0},{0},{0}};

Но, ниже также был принят компилятором

struct SampleStruct sStructs[3] = {0};

Я хотел бы узнать лучший и безопасный способ и подробно объяснить причину.

Ответы [ 2 ]

4 голосов
/ 20 декабря 2011
$ gcc --version
gcc (GCC) 4.6.1 20110819 (prerelease)

При использовании опции -Wall мой gcc выдает предупреждения о третьем:

try.c:11:9: warning: missing braces around initializer [-Wmissing-braces]
try.c:11:9: warning: (near initialization for ‘sStruct3[0]’) [-Wmissing-braces]

указывает, что вы должны написать = {{0}} для инициализации, которая устанавливает первое поле первой структуры равным 0, а все остальные неявно равным 0. Программа дает правильный результат в этом простом случае, но я думаю, что вы не должны полагаться на это и должны правильно инициализировать вещи.

1 голос
/ 19 декабря 2011

gcc-4.3.4 не выдает ошибку с первыми двумя объявлениями, тогда как с третьим выдает ошибку.

struct SampleStruct sStruct1 = {0}; работает, потому что 0 в этом случае является значением поля a.Остальные поля неявно инициализируются в ноль.

struct SampleStruct sStructs2[3] = {{0},{0},{0}}; работает, потому что здесь вы объявляете три структуры и инициализируете поле 'a' каждой из них равным нулю.Остальные поля неявно инициализируются в ноль.

struct SampleStruct sStructs3[3] = {0}; не работает, потому что в фигурных скобках компилятор ожидает увидеть что-то, что соответствует трем структурам, а число ноль просто не это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...