Возможный дубликат:
Каков размер void?
В §6.2.5.19 пророки сообщают нам, что:
Тип
void
содержит пустой набор значений
Тогда почему sizeof(void)
дает 1, когда 0 кажется достаточным?
Возможный дубликат:
Каков размер void?
В §6.2.5.19 пророки сообщают нам, что:
Тип
void
содержит пустой набор значений
Тогда почему sizeof(void)
дает 1, когда 0 кажется достаточным?
sizeof(void)
не будет компилироваться в компиляторе C.
ISO 9899: 2011 6.2.5/19
"Тип void содержит пустой набор значений, он является неполным тип объекта, который не может быть завершен."
ISO 9899: 2011 6.5.3.4/1
"Оператор sizeof не применяется к выражению, имеющему тип функции или неполный тип"
Это нормативный текст: sizeof (void) недействителен. C.
Это расширение gcc: http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Pointer-Arith.html#Pointer-Arith
В GNU C операции сложения и вычитания поддерживаются указателями на
void
и указателями на функции. Это делается путем обработки размера avoid
или функции как 1.Следствием этого является то, что
sizeof
также разрешено наvoid
и на типах функций, и возвращает 1.Опция
-Wpointer-arith
запрашивает предупреждение, если эти расширения используются.
Причиной того, что void
нужен размер для выполнения такой арифметики, является то, что ptr - ptr2
фактически не дает вам числовой разницы адресов, а количество элементов, в котором расположены два указателя, - и размер элемента, указывающего на void *ptr
составляет sizeof(*ptr)
, что sizeof(void)
.
Вероятно, вы используете gcc или какой-либо другой компилятор, который делает это как расширение (в C, sizeof (void) недопустимо).
gcc говорит:
В GNU C операции сложения и вычитания поддерживаются указателями на пустое и на указатели на функции. Это делается путем обработки размер пустоты или функции как 1.
Следствием этого является то, что sizeof также разрешен на void и on типы функций и возвращает 1.
Опция -Wpointer-arith запрашивает предупреждение, если эти расширения б.