【问题标题】:Why operator sizeof( function ) in C is outputting 1 byte [duplicate]为什么C中的运算符sizeof(函数)输出1个字节[重复]
【发布时间】:2012-09-08 00:08:41
【问题描述】:

可能重复:
Why is the size of a function in C always 1 byte?

考虑C中的以下代码sn-p:

double fn()
{
    return 1.1 ;
}

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

output 是:

1

为什么 sizeof() 操作符输出的是 1 个字节?

【问题讨论】:

标签: c sizeof


【解决方案1】:

sizeof 运算符不应应用于函数。它是没有意义的,它的行为没有定义。

大小运算符不应应用于具有 函数或不完整类型,...

参考:ISO/IEC 14882 (section 5.3.3)


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

参考:ISO/IEC 9899:1999 (section 6.5.3.4)


sizeof 运算符可能不适用于:

  • 一个位域
  • 函数类型
  • 未定义的结构或类
  • 不完整的类型(例如 void)

参考:http://publib.boulder.ibm.com/

【讨论】:

  • 这只是一个编译器的参考,但是我不相信它是所有编译器的定义源。
  • 这只是因为我需要一段时间才能找到所有参考资料,而这是我找到的第一个。我已经知道答案了,只是想在找到所有信息之前早点发布。
【解决方案2】:

当你在一个函数上使用sizeof时,它的值是没有意义的,就像这里描述的Why is the size of a function in C always 1 byte?

要获取返回值的大小,请尝试使用sizeof(fn()),因为sizeof 是编译时常量(在大多数情况下),但是fn 不会真正被调用。

不幸的是,要获得函数占用的字节大小是不可能的。如果您告诉我们您真正想要完成的工作,我们可能会帮助您做得更多。

【讨论】:

  • 显然,我不希望大小与返回类型的大小相同。我期待在 32 位架构上为 32 位的指针的大小。那为什么只有 1 个字节呢?
  • 试试sizeof(&fn)。函数不会衰减到 sizeof 上下文中的指针。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-29
  • 2018-03-30
  • 1970-01-01
  • 2018-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多