A void *
- допустимый тип с известным размером.На это указывает либо какой-либо объект, тип которого неизвестен, либо действительная нетипизированная память (т. Е. Память, возвращенная из malloc
).Таким образом, sizeof(void *)
является допустимым выражением.
В пункте 1 пункта 6.5.3.4 говорится:
Оператор sizeof
не должен применяться к выражению, которое имееттип функции или неполный тип, имя в скобках такого типа или выражение, обозначающее элемент битового поля.Оператор _Alignof
не должен применяться к типу функции или к неполному типу.
Поскольку void *
не является неполным типом, sizeof(void *)
допустим.Однако, поскольку тип void
является неполным, sizeof(void)
недопустим.
Обращаясь к вашему комментарию о void **
, это также допустимый тип, который указывает на объект типа void *
.
Некоторые компиляторы, такие как GCC, реализуют расширение, где void
имеет размер 1, поэтому sizeof(void) == 1
и арифметика указателей на void *
функционируют аналогично арифметике на char *
.Это, однако, идет вразрез со стандартом.