12

可能重复:
空隙的大小是多少?

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

void类型包含一组空值

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

4

3 回答 3

20

这是一个 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 *ptrsizeof(*ptr)which is sizeof(void)

于 2012-05-11T13:00:15.683 回答
12

sizeof(void)不会在 C 编译器上编译。

ISO 9899:2011 6.2.5/19

“void 类型包含一组空值;它是一种无法完成的不完整对象类型。”

ISO 9899:2011 6.5.3.4/1

“sizeof 运算符不得应用于具有函数类型或不完整类型的表达式”

这是规范文本:sizeof(void) 无效 C.

于 2012-05-11T13:22:29.993 回答
7

您可能正在使用 gcc 或其他一些将其作为扩展的编译器(在 C 中,sizeof(void) 无效)。

gcc 说:

在 GNU C 中,指向 void 的指针和指向函数的指针支持加法和减法运算。这是通过将 void 或函数的大小视为 1 来完成的。

这样做的结果是 sizeof 也允许在 void 和函数类型上使用,并返回 1。

如果使用这些扩展,选项 -Wpointer-arith 会请求警告。

于 2012-05-11T13:00:54.920 回答