在函数上使用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运算符不应用于具有函数类型或不完整类型的表达式
从中我们可以得出结论,您的程序调用了未定义的行为,并且不能给出输出的解释。