答案 0 :(得分:20)
这是一个gcc扩展名:http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Pointer-Arith.html#Pointer-Arith
在GNU C中,指向
void
的指针和指向函数的指针支持加法和减法操作。这是通过将void
或函数的大小视为1来完成的。这样做的结果是在
sizeof
和函数类型上也允许void
,并返回1.如果使用这些扩展,选项
-Wpointer-arith
会发出警告。
void
需要大小来执行此类算术的原因是ptr - ptr2
实际上并没有给出地址的数字差异,而是两个指针分开的元素数量 - 以及大小void *ptr
指向的元素是sizeof(*ptr)
,sizeof(void)
。
答案 1 :(得分:11)
sizeof(void)
将无法在C编译器上编译。
ISO 9899:2011 6.2.5 / 19
“void类型包含一组空值;它是不完整的 无法完成的对象类型。“
ISO 9899:2011 6.5.3.4/1
“sizeof运算符不应用于具有函数类型的表达式 不完整的类型“
这是规范性文本:sizeof(void)无效C.
答案 2 :(得分:7)
您可能正在使用gcc或其他编译器作为扩展名(在C中,sizeof(void)无效)。
gcc说:
在GNU C中,指针支持加法和减法操作 void和指向函数的指针。这是通过治疗来完成的 空格或函数的大小为1。
这样做的结果是sizeof也允许在void和on上 函数类型,并返回1。
如果这些扩展名为-Wpointer-arith选项请求警告 使用