的数据
下面是程序的文本:
#include <stdio.h>
int f(int x){
return x+1;
}
int main() {
int (*p)(int) = f;
printf( "%d\n", sizeof(p) );
printf( "%d\n", sizeof(f) );
}
字符串
这张图片与C代码有关,我的问题只针对C。
这里f
是函数名,p
是指向函数f
的指针。
由于p
最终是一个地址,因此根据地址总线的大小,sizeof(p)
的输出将为真,这完全没有问题。
这里f
也指向函数f
。所以f
也是一个地址。
我的主要问题是,为什么sizeof(f)
的输出不是8,为什么是1,它是如何1的?
2条答案
按热度按时间nle07wnf1#
不允许取函数的大小。关于6.5.3.4
sizeof
运算符的C standard的www.example.com部分指出:sizeof
运算符不应应用于具有函数类型或不完整类型的表达式、此类类型的括号名称或指定位字段成员的表达式。_Alignof
运算符不应应用于函数类型或不完整类型。这被认为是一个 * 约束违反 *,它触发undefined behavior。
此外,打印
size_t
类型的表达式(由sizeof
运算符给出的类型)的正确格式说明符是%zu
,而不是%d
。使用错误的格式说明符也会触发未定义的行为。在这个特定的例子中,你得到了一个对第一种情况有意义的值,但不能保证这一点。0lvr5msh2#
对于初学者,您必须使用转换规范
%zu
来输出大小为operator
的表达式的值字符串
否则,通常使用转换规范
%d
而不是%zu
的这种调用可能会调用未定义的行为。指针是一个完整的类型。它的大小是已知的。
这里f也指向函数f。所以最终f也是一个地址。
f
不是指针。这是一个函数名。根据C标准,你不能对函数应用sizeof
运算符。函数可以隐式转换为指向函数的指针。但是,如果允许将sizeof
运算符应用于函数,则不会对sizeof
运算符中使用的表达式执行隐式转换。例如,数组也可以隐式地转换为指向其第一个元素的指针。但是,如果在sizeof
运算符中使用数组,则不会执行此类隐式转换。考虑下面的代码片段
型
它的输出可能看起来像
型