为什么C中函数的大小总是1个字节?

时间:2012-09-04 07:58:12

标签: c function size sizeof

当我们使用sizeof()检查函数的大小时,我们总是得到 1个字节。 这个1字节表示什么?

4 个答案:

答案 0 :(得分:80)

这是违反约束的行为,您的编译器诊断它。如果它尽管如此编译它,你的程序有不确定的行为[感谢@Steve Jessop澄清失败模式,并参见@Michael Burr's answer为什么有些编译器允许这样做]:来自C11,6.5.3.4。 / 1:

  

sizeof运算符不应用于具有函数类型

的表达式

答案 1 :(得分:56)

这不是未定义的行为 - 当使用带有函数指示符(函数名称)的sizeof运算符时,C语言标准需要诊断,因为它违反了sizeof运算符。

但是,作为C语言的扩展,GCC允许对void指针和函数指针进行算术运算,这是通过将void或函数的大小视为1来完成的。 。因此,sizeof运算符将评估为1 void或具有GCC的函数。见http://gcc.gnu.org/onlinedocs/gcc/Pointer-Arith.html#Pointer-Arith

通过使用sizeof-pedantic选项加入GCC,您可以让GCC在使用-Wpointer-arith这些操作数时发出警告。或者使用-Werror=pointer-arith将其设为错误。

答案 2 :(得分:13)

它表示编译器编写器决定值为1而不是让恶魔从你的鼻子中飞出(事实上,它是sizeof的另一个未定义的用法,它给了我们这个表达式:“C编译器本身必须发布诊断如果这是您的程序产生的第一个必需的诊断,然后MAY本身会导致恶魔从您的鼻子飞过(顺便说一句,很可能是记录的诊断信息),就像它可能会对进一步的违规行为进行进一步诊断一样语法规则或约束(或者,就此而言,由于它选择的任何原因)。“https://groups.google.com/forum/?fromgroups=#!msg/comp.std.c/ycpVKxTZkgw/S2hHdTbv4d8J

从这里可以得出俚语术语“鼻子恶魔”,无论编译器决定如何应对未定义的构造。对于这种情况,1是此编译器的鼻恶魔。

答案 3 :(得分:7)

正如其他人所指出的,sizeof()可以获取任何有效的标识符,但它不会返回函数名称的有效(真实且真实且有效)结果。此外,它肯定可能会或可能不会导致“恶魔出鼻”综合症。

如果要分析程序函数大小,请检查链接器映射,该映射可以在中间结果目录(将事物编译为.obj / .o或生成的映像/可执行文件所在的目录)中找到。有时可以选择生成或不生成此映射文件......它依赖于编译器/链接器。

如果你想要一个指向函数的指针的大小,它们的大小都是相同的,就是你的cpu上的一个寻址字的大小。