应用于函数类型时,解释sizeof运算符的输出

时间:2016-06-21 08:18:41

标签: c function printf sizeof

以下代码的输出为:

Hello World4

如何?

#include "stdio.h"  

int func()  
{
    return(printf("Hello world"));
}

int main()  
{
    printf("%d",sizeof(fun));
    return 0;  
}

如需更多参考,请查看图片enter image description here

PS: - 根据我的说法,sizeof()调用func()函数,其中返回statemnt调用printf函数,打印hello world nd返回字符串的长度,返回函数为11,然后sizeof()函数返回大小11是int和int的值取决于编译器2或4

2 个答案:

答案 0 :(得分:5)

sizeof运算符无法应用于函数。

来自C11草案,6.5.3.4 sizeof和alignof运算符

  

sizeof运算符不应用于具有的表达式   函数类型或不完整类型,括号的名称   一个类型,或指定一个位字段成员的表达式。

所以你正在做的是按照C标准的约束违规

使用-std=c11进行编译,gcc会产生警告:

$gcc -std=c11 -Wall -pedantic-errors s.c
test.c: In function ‘main’:
s.c:10:23: error: invalid application of ‘sizeof’ to a function type [-Wpointer-arith]
     printf("%d",sizeof(func));
                       ^
test.c:10:12: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat=]
     printf("%d",sizeof(func));

正如您所看到的,还有另一个问题。您无法使用%d来打印size_t%zu是打印size_t的正确格式说明符。

答案 1 :(得分:0)

首先,使用%zu格式说明符打印sizeof运算符的输出,因为生成的结果是size_t类型。

那就是引用C11,章节§6.5.3.4/ p1,sizeofalignof运营商,(强调我的

  

sizeof运算符不应用于具有函数类型的表达式或   不完整的类型,这种类型的括号名称,或表达式   指定位字段成员。 [...]

所以,您的代码不符合

最后,对于托管环境,int main()至少应为int main(void)