Ответ 1
То, что вы ищете, это сложный литерал. Это было добавлено к языку на C99.
Ваш первый случай:
struct MyStruct q = {x,y,..,z};
- синтаксис, специфичный для инициализации. Ваш второй случай, в педантике языка, не является инициализацией, а назначением. Правая часть задания должна быть структурой правильного типа. До C99 на языке не было синтаксиса для написания строкового литерала, который вы пытаетесь сделать. {x, y,.., z} выглядел как блок с выражением внутри. Если бы кто-то вдохновлялся, чтобы попытаться представить его как буквальное значение, хотя язык не сделал этого, нельзя было быть уверенным в его типе. (В вашем контексте вы могли бы сделать хорошее предположение.)
Чтобы разрешить эту проблему и решить проблему с типом, C99 добавил синтаксис, чтобы вы могли написать:
q = (struct MyStruct){x,y,...,z};