C语言中sizeof(函数指针)与sizeof(函数名)的结果差异疑问
为什么
sizeof(f)返回1而不是函数指针的大小? 首先明确核心规则:C语言标准不允许对函数类型使用sizeof操作符。sizeof的操作数必须是对象类型、void类型或者不完整类型,而函数类型不属于这些范畴,所以sizeof(f)本质是未定义行为——编译器可以自由选择如何处理这种情况,不同编译器可能给出不同结果。
你看到的返回1,是GCC、Clang这类常见编译器的非标准处理方式:
- 当直接对函数名
f使用sizeof时,编译器没有直接报错,而是将其视为一个“伪对象”返回占位大小1。这不是函数的实际大小(函数本身没有内存中的对象大小概念),只是编译器为了兼容某些旧代码或避免报错给出的一个默认值。 - 而函数指针
p属于对象类型(指针类型),它的大小由系统的地址总线宽度决定(64位系统通常是8字节,32位是4字节),这完全符合C标准的规定。
补充一点:如果尝试直接对函数类型使用sizeof,比如写sizeof(int(int)),编译器会直接报错,因为这明显违反标准;但对函数名f,编译器做了宽容处理,没有报错而是返回1,这是编译器的扩展行为,不是标准要求的。
内容的提问来源于stack exchange,提问作者Anuj Yadav
相关产品推荐
相关产品推荐

