在函数上使用sizeof的输出

时间:2011-08-08 20:37:10

标签: c sizeof

为什么以下代码给出:

#include<stdio.h>

int voo()
{
    printf ("Some Code");
    return 0;
}


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

以下输出:

1

2 个答案:

答案 0 :(得分:9)

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

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

他们为void做了同样的事情,所以sizeof (void)产生1,并允许void*上的指针算术。

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

答案 1 :(得分:3)

The C99 Standard说:

  

6.3.2.1/4

     

除非是   sizeof运算符的操作数54)或一元&amp;运算符,函数指示符   type''function returns type''转换为类型为''指针的表达式   函数返回类型''。

并在54)脚注中说,

  

因为没有发生这种转换,sizeof运算符的操作数仍然是函数指示符,并且违反了6.5.3.4中的约束。

6.5.3.4中的相关段落是

  

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

我们可以从中结束您的程序调用{​​{3}},并且无法解释输出。