Полагаю, когда вы вызываете sizeof
для типа struct
, C рекурсивно вызывает sizeof для полей struct
. Таким образом, struct st *x = malloc(sizeof(struct st));
действительно работает, только если struct st
имеет фиксированный размер. Это важно только в том случае, если в вашей структуре есть что-то вроде строки переменного размера, и вы НЕ хотите каждый раз указывать максимальную длину.
В общем
struct st *x = malloc(sizeof(struct st));
работает. Иногда вы можете столкнуться с структурами переменного размера или «абстрактными» структурами (например, абстрактный класс из Java), и компилятор скажет вам, что он не может определить размер struct st. В этих случаях либо вам придется вычислять размер вручную и вызывать malloc с номером, либо вы найдете функцию, которая возвращает полностью реализованную и malloc-версию нужной вам структуры.