为什么sizeof(void)== 1?

时间:2012-05-11 12:57:39

标签: c gcc

  

可能重复:
  What is the size of void?

在§6.2.5.19中,先知让我们知道:

  

void类型包含一组空值

那么为什么sizeof(void)会产生1,当0似乎就足够了?

3 个答案:

答案 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选项请求警告   使用