【问题标题】:What is the sizeof(main), sizeof(printf), sizeof(scanf)?sizeof(main)、sizeof(printf)、sizeof(scanf)是什么?
【发布时间】:2010-10-01 11:52:42
【问题描述】:

在gcc编译器中,sizeof(main)sizeof(printf)sizeof(scanf)都是1。 我想知道所有这些的大小是1。这背后的逻辑是什么?

【问题讨论】:

标签: c sizeof


【解决方案1】:

因为 C(99) 标准要求 (§6.5.3.4/1)

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

所以返回值是没有意义的。如果需要sizeof 函数指针,请使用

sizeof(&main)
sizeof(&printf)
sizeof(&scanf)

gcc 在 sizeof 无意义的类型上返回 1(参见 c-common.c):

4187     if (type_code == FUNCTION_TYPE)
4188       {
4189         if (is_sizeof)
4190           {
4191             if (complain && (pedantic || warn_pointer_arith))
4192               pedwarn (loc, pedantic ? OPT_pedantic : OPT_Wpointer_arith,
4193                        "invalid application of %<sizeof%> to a function type");
4194             else if (!complain)
4195               return error_mark_node;
4196             value = size_one_node;
4197           }
4198         else
4199           value = size_int (FUNCTION_BOUNDARY / BITS_PER_UNIT);
4200       }
4201     else if (type_code == VOID_TYPE || type_code == ERROR_MARK)
4202       {
4203         if (type_code == VOID_TYPE
4204             && complain && (pedantic || warn_pointer_arith))
4205           pedwarn (loc, pedantic ? OPT_pedantic : OPT_Wpointer_arith,
4206                    "invalid application of %qs to a void type", op_name);
4207         else if (!complain)
4208           return error_mark_node;
4209         value = size_one_node;
4210       } 

【讨论】:

  • 那么将 sizeof 应用于函数类型是未定义/未指定的行为?
  • thnx KennyTM...但是我想知道 gcc 编译器是如何返回 1 的??
  • @Parixit:因为你做了一些没有意义的事情,所以你得到了一个没有意义的结果。垃圾进垃圾出。这是未定义的行为,编译器可以做它喜欢的任何事情,包括格式化你的硬盘或让你的头发着火。但它选择做一些不那么戏剧化的事情,并且只返回 1
  • 就标准而言,这不应该导致诊断,而不是未定义的行为,因为它违反了语言限制?事实上,使用-pedantic,gcc 会发出警告。显然在非标准模式下(没有-pedantic),gcc 可以做它喜欢做的事:如果你不遵循标准,那么 everything 在定义上都是未定义的行为。
  • @jaif:它应该让他的头发着火。
猜你喜欢
  • 2015-08-21
  • 2013-09-24
  • 1970-01-01
  • 2012-06-14
  • 1970-01-01
  • 1970-01-01
  • 2010-11-09
  • 1970-01-01
相关资源
最近更新 更多