Ответ 1
В вашем коде
struct buf_stats *bs = malloc(sizeof(struct buf_states*)) ;
неверно по многим причинам, например
- Вы используете тип undefined (как вы упомянули)
- Вы выделяете меньше памяти (выделяя вместо типа указатель на тип)
Но ваш компилятор не может много помочь в _this_case для данного конкретного типа ошибок, поскольку
-
указатель на (любой) тип в платформе имеет определенный размер, для чего структура (т.е. тип переменной, на которую она указывает) не обязательно должна быть полной (определенной). Это причина, по которой мы можем иметь структуры для самореференции, правильно?
-
malloc()
не имеет понятия о типе целевой переменной. Он просто считывает аргумент нужного размера, возвращает указатель (который имеет типvoid *
) в выделенную память и при назначении, который изменяется на целевой тип. Невозможно рассчитать несоответствие в целевом размере (типе) с выделенным объемом памяти.
Самый удобный и простой способ избежать подобных ошибок - не использовать жесткий код непосредственно в качестве операнда sizeof
, скорее, использовать ссылку на переменную.
Что-то вроде
struct buf_stats *bs = malloc(sizeof *bs) ; // you can write that as (sizeof (*bs)) also
// sizeof *bs === sizeof (struct buf_stats)
что эквивалентно
struct buf_stats *bs = malloc(sizeof(struct buf_stats)) ;
но является более надежным и менее подверженным ошибкам.
Примечания:
- Вам не нужна скобка, если операнд не является именем типа.
- Этот оператор не нуждается в каких-либо изменениях при изменении типа целевой переменной
bs
.