sizeof(main),sizeof(printf),sizeof(scanf)是多少?

Par*_*ita 8 c sizeof

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

ken*_*ytm 22

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

sizeof不应将运算符应用于具有函数类型或不完整类型的表达式,此类型的带括号的名称,或应用于指定位字段成员的表达式.

所以返回值毫无意义.如果需要sizeof函数指针,请使用

sizeof(&main)
sizeof(&printf)
sizeof(&scanf)
Run Code Online (Sandbox Code Playgroud)

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       } 
Run Code Online (Sandbox Code Playgroud)

  • @Parixit:因为你做了一些毫无意义的事情,所以你得到的结果毫无意义.垃圾进垃圾出.它是未定义的行为,编译器可以做任何它喜欢的事情,包括格式化你的硬盘或让你的头发着火.但它选择做一些不那么戏剧化的事情,只是返回1 (11认同)
  • 就标准而言,这不应该导致诊断而不是未定义的行为,因为它违反了语言限制吗?事实上,对于`-pedantic`,gcc会发出警告.显然在非标准模式下(没有`-pedantic`),gcc可以做它喜欢的事情:如果你没有遵循标准,那么*所有*都是未定义的行为. (2认同)
  • @jaif:它应该让他的头发着火. (2认同)