Недавно я встретил этот вопрос где мы получили определение 2D-массива, подобное этому:
int x[][3] = { 0, 1, 2, 3, 4, 5 };
Первое измерение пусто / размер массива неизвестен. Массив z
инициализируется инициализатором одномерного массива.
Вот что говорит стандарт C (подчеркните мой):
"Если агрегат или объединение содержит элементы или члены, которые являются агрегатами или объединениями, эти правила рекурсивно применяются к субагрегатам или содержащимся объединениям. Если инициализатор субагрегата или объединенного объединения начинается с левой фигурной скобки, инициализаторы, заключенные в эту фигурную скобку, и соответствующая ей правая скобка инициализируют элементы или члены субагрегата или содержащегося объединения. В противном случае, только достаточное количество инициализаторов из списка учитывается для элементов или членов субагрегата или первого члена содержащегося объединения; любые оставшиеся инициализаторы остаются для инициализации следующего элемент или член агрегата, частью которого является текущий субагрегат или содержащееся объединение .
Источник: ISO / IEC 9899: 2018 (C18), §6.7. 9 / 20.
Это означает, что инициализация четко определена. 2D-массив известного количества элементов с инициализатором 1D-массива.
Таким образом, fe:
int y[2][3] = { 0, 1, 2, 3, 4, 5 };
должно быть эквивалентно:
int y[2][3] = { { 0, 1, 2 } , { 3, 4, 5 } };
Меня беспокоит следующее:
«Если инициализируется массив неизвестного размера, его размер определяется наибольшим индексированным элементом с явным инициализатор . Тип массива завершается в конце списка инициализаторов. "
Источник: ISO / IEC 9899: 2018 (C18), §6.7.9 /22.
Это означает, что если размер массива / количество элементов в нем неизвестны, требуется, чтобы 2D-массив:
- Требуется самый большой индексированный элемент и
- Этот элемент должен иметь явный инициализатор.
Мои вопросы:
ИМХО, и после моих фактических знаний этого не должно. Но, может быть, я здесь что-то неправильно понял.
Я открыл этот вопрос, потому что другой вопрос помечен тегами C и C ++, поэтому юрист не подходит для настоящего языка и не фокусируется на C, плюс вопрос другого вопроса на самом деле совсем другой.