Это составной литерал, определенный в разделе 6.5.2.5 стандарта C99.
Он не является частью языка C ++, поэтому неудивительно, что компиляторы C ++ его не компилируют.(или компиляторы Java или Ada в этом отношении)
Значение составного литерала - это значение безымянного объекта, инициализированного списком инициализатора.Если составной литерал находится вне тела функции, объект имеет статическую продолжительность хранения;в противном случае он имеет автоматическую продолжительность хранения, связанную с вмещающим блоком.
Так что нет, он не разрушит стек.Компилятор выделяет хранилище для объекта.
Круглые скобки помещаются вокруг типа, после чего следует список инициализатора - это не приведение, поскольку пустой список инициализатора не имеет смысла в синтаксисе C99;вместо этого это постфиксный оператор, применяемый к типу, который возвращает объект данного типа.Вы не создаете { 0, 3 }
и не преобразуете его в массив, вы инициализируете int[2]
со значениями 0 и 3.
Что касается его использования, я не вижувеская причина для этого в одной строке, хотя может быть, что a может быть переназначен для указания на какой-то другой массив, и поэтому это более короткий способ сделать первые две строки:
int default_a[] = { 0, 2 };
int *a = default_a;
if (some_test) a = get_another_array();
I 'Мы нашли это полезным для передачи временных объединений в функции
// fills an array of unions with a value
kin_array_fill ( array, ( kin_variant_t ) { .ref = value } )