【问题标题】:Explain the Output of sizeof operator when applied to a function type解释 sizeof 运算符应用于函数类型时的输出
【发布时间】:2016-10-22 16:27:30
【问题描述】:

以下代码的输出是:

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 并返回字符串的长度,即 11 到返回函数,然后 sizeof() 函数返回大小11 是 int 和 int 的值取决于编译器 2 或 4

【问题讨论】:

  • 您确定该输出吗?看不到任何func 的调用,d4 之间的空格是从哪里来的?
  • 该代码无法在 MSVC 中编译。产生你所说的并不是代码。
  • @4386427 根据理论点,我认为答案是正确的。但是在任何 IDE 上运行时都会失败。此外,答案因IDE而异。
  • 输出“Hello World”的唯一方法是调用 func()。但在代码中没有任何地方是这种情况。在sizeof(func) 中,func 是一个函数指针,因此即使 sizeof 不是特殊运算符 func 也不会被调用。但是 sizeof 是特殊的,即使是 sizeof(func()),它实际上是有效的代码,也不会调用 func。不评估 sizeof 的参数,仅评估类型。 sizeof(func())sizeof(int) 相同,在大多数系统上为 4。

标签: c function printf sizeof


【解决方案1】:

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 的正确格式说明符。

【讨论】:

  • 只是一个小问题,可能诊断是由于pedantic-errors,而不是由于-std=c11。 (请参考我的回答中的链接,-std=c99 也一样 [严格模式])。
  • 我知道这一点,但如果你运行代码,你会得到答案,但不是必需的。如果您忽略 C11 草案,请进行试运行,那么答案是正确的,但不是在 IDE 上
  • 这不是关于C11草案标准的问题。它是关于 C 程序的实际输出。
  • 如果您忽略什么标准(这与第一个 C 标准 - C89 以来相同)所说的并在非标准环境中编译,那么您必须查阅编译器的文档。
  • 好吧,提问者对标准不感兴趣——他只想解释为什么它是 4 而不是 11。
【解决方案2】:

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

也就是说,引用 C11,第 §6.5.3.4/p1 章,sizeofalignof 运算符,(强调我的

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

所以,您的代码不符合要求

  • 如果您使用gccyou'll see the error (warning) as 启用-pedantic 选项,

    'sizeof' 对函数类型的无效应用

  • 没有-pedantic 选项,gcc compiles the code and produces a result as 1

    It is 可能是 gcc的编译器扩展。

    引用在线 gcc 手册,(我的重点

    在 GNU C 中,在指向 void 的指针和指向函数的指针上支持加法和减法运算。这是通过将 void 或函数的大小视为 1 来完成的。

    这样做的结果是sizeof 也允许在void 和函数类型上使用,并返回 1。

    如果使用了这些扩展,-Wpointer-arith 选项会请求警告。

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

【讨论】:

    猜你喜欢
    • 2019-06-25
    • 1970-01-01
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2021-04-27
    相关资源
    最近更新 更多