MyStruct someObjects[5] = {};
не соответствует C и то, соответствует ли MyStruct someObjects[5] = {NULL};
C, определяется реализацией *.
Вы должны инициализировать его с MyStruct someObjects[5] = {0};
.{0}
- это способ инициализации по умолчанию / нулевой инициализации любого массива, агрегатного объекта или составного литерала в C.
{0}
работает для инициализации по умолчанию / нулевой инициализации, поскольку 6.7.9p19 и 6.7.9p20 приведет к тому, что 0
будет рекурсивно нацеливаться на первый примитивный объект, потому что каждый примитивный объект данных в C является либо числовым, либо указателем и, следовательно, инициализируется с помощью 0
и, наконец, потому что 6.7.9p21 говорит, что:
Если в списке, заключенном в фигурные скобки, меньше инициализаторов, чем элементов или элементов агрегата или меньше символов в строковом литерале, используемом для инициализации массиваизвестного размера, чем элементы в массиве, оставшаяся часть агрегата должна быть неявно инициализирована так же, как объекты, имеющие статическую продолжительность хранения.
*NULL
можно определить как0
, в этом случае {NULL}
в порядке, или его также можно определить (void*)0
, в этом случае {NULL}
не в порядке в вашем случае, потому чтоконечно, ваш первый примитивный объект массива (int type1;
) не является указателем, инициализируемым из (void*)
или даже указателем.