Если бы у вас был указатель p
, указывающий на struct cheese_msgbuf
, вы могли бы получить размер элемента name
с помощью sizeof p->name
.
В этом коде такого указателя нет, поэтому он создает его путем преобразования 0
в тип struct cheese_msgbuf *
. Результатом является нулевой указатель.
В выполняемом коде было бы неправильно оценивать p->name
, когда p
является нулевым указателем. Во многих реализациях C он генерирует исключение, и это не определено стандартом C.
Однако оператор sizeof
не оценивает свой операнд в этой ситуации. Это операция времени компиляции, которая производит размер операнда на основе его типа , а не на основе какой-либо фактической оценки операнда. Поскольку номинальным типом выражения ((struct cheese_msgbuf *) 0)->name
является char [20]
, выражение sizeof ((struct cheese_msgbuf *) 0)->name
дает 20.
(Если операнд sizeof
является массивом переменной длины, операнд вычисляется. В противном случае, операнд не оценивается.)