почему я не могу использовать частичную инициализацию структуры для malloced struct в C

Явно в C99 вы можете просто инициализировать статически выделенную структуру таким образом

struct sometype { int a; double b; }; sometype a = { .a = 0; }; 

Ну, это не относится к структуре на куче, как это.

 struct sometype *a = malloc(sizeof(struct sometype)); *a = { .a = 0; }; 

С GCC 4.9.2 компилятор жаловался

 error: expected expression before '{' token 

Я знаю, что это глупо, но есть ли какой-либо синтаксис или техническая причина, что я не могу этого сделать?

    Существует различие между инициализацией структуры и назначением.

    При использовании памяти кучи это всегда назначение, поскольку инициализация происходит только тогда, когда вы фактически объявляете экземпляр (а не только указатель на экземпляр).

    Вы можете использовать составные литералы :

     struct sometype *ms = malloc(sizeof *ms); *ms = ((struct sometype) { .a = 0 }); 

    Но, конечно, это может быть хуже, чем просто:

     ms->a = 0; 

    так как он будет писать во все поля структуры, задав все поля, которые не были указаны в литерале до нуля. В зависимости от того, что вам нужно, это может быть бесполезно дорогостоящим.

    Это не относится к структуре в куче.

    Да. Я не буду. Это потому, что есть разница в инициализации и назначении . В случае

     sometype a = {.a =0}; 

    это инициализация. В случае динамического распределения

     sometype *a = malloc(sizeof(struct sometype); *a = {.a =0}; 

    есть назначение.