什么是 sizeof(main)、sizeof(printf) 以及 sizeof(scanf)?

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

"sizeof(function name)" 返回什么? - Paul R
1个回答

25

由于C(99)标准要求(§6.5.3.4/1)

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

因此,返回值毫无意义。如果您需要函数指针的sizeof,请使用

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

对于那些 sizeof 无意义的类型,gcc 返回值为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 应用于函数类型是未定义/未指定的行为? - codymanix
谢谢KennyTM...但我想知道gcc编译器如何返回1? - Parikshita
11
因为你做了一些毫无意义的事情,所以你得到了一个毫无意义的结果。垃圾进,垃圾出。这是未定义的行为,编译器可以做任何它喜欢的事情,包括格式化你的硬盘或把你的头发点燃。但它选择做一些不那么戏剧性的事情,只是返回了1。 - jalf
2
就标准而言,这不应该导致未定义行为,而应该是一种诊断,因为它违反了语言约束。确实,在使用“-pedantic”选项时,gcc会发出警告。显然,在非标准模式(没有“-pedantic”)下,gcc可以随意处理:如果您不遵循标准,则根据定义,所有内容都是未定义行为。 - Steve Jessop
2
@jaif:这应该会让他火冒三丈。 - user82238
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接