Подтвердить что ты не робот

Инициализация многомерного массива: {0} по сравнению с {{{0}}}

В C-коде, который я анализирую, существует много многомерных (структурных) массивов, которые инициализируются с другим количеством фигурных скобок, например. {{0}} или {{{0}}}.

Однако замена их на {0} также отлично работает.

Существует ли (функциональная) разница между использованием одного или нескольких наборов фигурных скобок ({})?

4b9b3361

Ответ 1

Нет, функциональной разницы нет. Стандарт C позволяет исключить промежуточный {}. В частности, форма { 0 } является инициализатором, который может использоваться для всех типов данных.

Ответ 2

У вас есть два варианта: либо { 0 }, который работает для любого типа агрегата или объединения, а ноль инициализирует каждый элемент или использует правильную форму, которая должна соответствовать всем членам правильно.

Ответ 3

Чтобы повторить то, что уже сказал Дженс, {0} работает для любого типа. Это "универсальный нулевой инициализатор" в C. См. Проект C11, 6.7.9 Инициализация.

Итак, для инициализации 3D-массива можно использовать {0} или {{{0}}}. Лично я использовал бы {0}, так как было бы легче печатать и читать и работать для каждого типа. Это означает, что все допустимые инициализации:

int main(void)
{
    int x = {0,};
    int *p = {0,};
    int *q = {0};
    int arr[3][3][3][3] = {0};
}

Что еще более важно, если у вас есть какой-то неизвестный/непрозрачный тип, например, из сторонних библиотек, то единственный переносимый способ для их инициализации используется {0}. Любой другой способ обнуления (например, использование memset() или непосредственно some_type_t state = 0;) потребует некоторых внутренних знаний о соответствующем типе и рисках, которые не переносятся.