为什么以下代码给出:
#include<stdio.h>
int voo()
{
printf ("Some Code");
return 0;
}
int main() {
printf ("%zu", sizeof voo);
return 0;
}
以下输出:
1
答案 0 :(得分:9)
C语言没有为函数定义sizeof
。表达式sizeof voo
违反了约束,并且需要来自任何符合标准的C编译器的诊断。
gcc在函数指针上实现指针算法作为扩展。为了支持这一点,gcc任意假设函数的大小为1,因此在函数地址中添加42,如果地址为42个字节,则会给你一个超出函数地址的地址。
他们为void做了同样的事情,所以sizeof (void)
产生1,并允许void*
上的指针算术。
如果要编写可移植代码,最好避免使用这两种功能。使用-ansi -pedantic
或-std=c99 -pedantic
来获取有关此类事件的警告。
答案 1 :(得分:3)
6.3.2.1/4
除非是 sizeof运算符的操作数54)或一元&amp;运算符,函数指示符 type''function returns type''转换为类型为''指针的表达式 函数返回类型''。
并在54)脚注中说,
因为没有发生这种转换,sizeof运算符的操作数仍然是函数指示符,并且违反了6.5.3.4中的约束。
6.5.3.4中的相关段落是
sizeof运算符不应用于具有函数类型的表达式 不完整的类型
我们可以从中结束您的程序调用{{3}},并且无法解释输出。