Почему sizeof (void) == 1?

Возможный дубликат:
Каков размер void?

В §6.2.5.19 пророки сообщают нам, что:

Тип void содержит пустой набор значений

Тогда почему sizeof(void) дает 1, когда 0 кажется достаточным?

Ответ 1

sizeof(void) не будет компилироваться в компиляторе C.

ISO 9899: 2011 6.2.5/19

"Тип void содержит пустой набор значений, он является неполным тип объекта, который не может быть завершен."

ISO 9899: 2011 6.5.3.4/1

"Оператор sizeof не применяется к выражению, имеющему тип функции или неполный тип"

Это нормативный текст: sizeof (void) недействителен. C.

Ответ 2

Это расширение gcc: http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Pointer-Arith.html#Pointer-Arith

В GNU C операции сложения и вычитания поддерживаются указателями на void и указателями на функции. Это делается путем обработки размера a void или функции как 1.

Следствием этого является то, что sizeof также разрешено на void и на типах функций, и возвращает 1.

Опция -Wpointer-arith запрашивает предупреждение, если эти расширения используются.

Причиной того, что void нужен размер для выполнения такой арифметики, является то, что ptr - ptr2 фактически не дает вам числовой разницы адресов, а количество элементов, в котором расположены два указателя, - и размер элемента, указывающего на void *ptr составляет sizeof(*ptr), что sizeof(void).

Ответ 3

Вероятно, вы используете gcc или какой-либо другой компилятор, который делает это как расширение (в C, sizeof (void) недопустимо).

gcc говорит:

В GNU C операции сложения и вычитания поддерживаются указателями на пустое и на указатели на функции. Это делается путем обработки размер пустоты или функции как 1.

Следствием этого является то, что sizeof также разрешен на void и on типы функций и возвращает 1.

Опция -Wpointer-arith запрашивает предупреждение, если эти расширения б.