在函数上使用sizeof的输出

为什么以下代码给出:

#include int voo() { printf ("Some Code"); return 0; } int main() { printf ("%zu", sizeof voo); return 0; } 

以下输出:

 1 

C语言没有定义函数的sizeof 。 表达式sizeof voo违反了约束,并且需要来自任何符合标准的C编译器的诊断。

gcc将函数指针上的指针算法实现为扩展。 为了支持这一点,gcc任意假设函数的大小为1,因此在函数地址中添加42,就会得到一个超出函数地址42个字节的地址。

它们对void做了同样的事情,因此sizeof (void)产生1,并且允许在void*上使用指针算术。

如果要编写可移植代码,最好避免使用这两种function。 使用-ansi -pedantic-std=c99 -pedantic来获取此类事件的警告。

C99标准说:

6.3.2.1/4

除非它是sizeof运算符54)或一元&运算符的操作数,否则具有类型”函数返回类型”的函数指示符将转换为具有类型”指向函数返回类型’的指针的表达式。

它说,在54)脚注中

由于不会发生此转换,因此sizeof运算符的操作数仍然是函数指示符,并且违反了6.5.3.4中的约束。

6.5.3.4中的相关段落是

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

从中我们可以得出结论,您的程序调用了未定义的行为,并且不能给出输出的解释。