以下代码的输出为:
Hello World4
如何?
#include "stdio.h"
int func()
{
return(printf("Hello world"));
}
int main()
{
printf("%d",sizeof(fun));
return 0;
}
PS: - 根据我的说法,sizeof()调用func()函数,其中返回statemnt调用printf函数,打印hello world nd返回字符串的长度,返回函数为11,然后sizeof()函数返回大小11是int和int的值取决于编译器2或4
答案 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,sizeof
和alignof
运营商,(强调我的)
sizeof
运算符不应用于具有函数类型的表达式或 不完整的类型,这种类型的括号名称,或表达式 指定位字段成员。 [...]
所以,您的代码不符合。
如果您使用-pedantic
启用gcc
选项,you'll see the error (warning) as,
'sizeof'
无效应用于函数类型
没有-pedantic
选项,gcc
compiles the code and produces a result as 1
。
<强> It is 强> likely to be a compiler extension for gcc
.
引自在线gcc手册,(我的重点)
在GNU C中,指向
void
的指针和指向函数的指针支持加法和减法操作。这是通过将void
或函数的大小视为1来完成的。这样做的结果是
sizeof
和void
以及函数类型也允许{1}},并返回1.如果使用这些扩展程序,选项
-Wpointer-arith
会发出警告。
最后,对于托管环境,int main()
至少应为int main(void)
。