sizeof(函数)总是返回1.为什么?

HAR*_*HIK 3 c printf function-pointers sizeof

使用sizeof()的函数的大小始终返回1

我只是试图找到一个函数的大小.虽然使用sizeof()来查找它总是返回的大小1.即使函数是一个定义良好的函数它只返回1.我只想知道为什么它返回1.在说sizeof(功能)时它实际上考虑了什么.

考虑一个简单的交换功能.我用fun3来表示占用的地址差异.

void fun1(int a,int b)
{
 int temp;
 temp=a;
 a=i;
 i=b;
 printf("%d\t %d\n",a,b);
}
void fun2()
{

}
void fun3()
{

}
void main()
{
 printf("fun1\t Address : %d \t Size : %d\n",fun1,sizeof(fun1));
 printf("fun2\t Address : %d \t Size : %d\n",fun2,sizeof(fun2));
 printf("fun3\t Address : %d \t Size : %d\n",fun3,sizeof(fun3));
}
Run Code Online (Sandbox Code Playgroud)

这里的输出是
fun1地址:4199248大小:1
fun2地址:4199301大小:1
fun3地址:4199307文件大小:1

fun1占用的地址数量巨大,fun2仅占用6.但两者的大小保持不变

tem*_*def 10

我怀疑这里存在一系列问题导致"这是未定义的行为"的答案.

首先要注意的是你不应该使用%d打印指针printf.该%d修改是打印ints和ints为并不总是转换为从通常的方式指针.例如,在64位系统上,可能是a int为32位且指针为64位的情况,这意味着将指针传入printf然后尝试打印它%d可能只打印一半位.您应该在%p任何时候打印指针时使用说明符.

那建议你现在看到的是什么的一些量可能是由于%d您的指针,然后离开从指针的其他位由第二得到回升只是拿起一半的比特%d修改,这意味着1该你在这里看到的实际上并不是函数指针的大小,而是由于格式字符串错误导致的垃圾数据.这将是未定义的行为 - 糟糕的时代!

现在,您将如何打印函数本身的地址?坏消息是没有可移植的方法来做到这一点.通常,对于指针,您可以只使用%p修饰符.但是函数指针在C中是不常见的,因为它们不能隐式转换为普通指针.也就是说,您无法将函数指针移植到例如a void *void *a函数指针.其实际原因是"因为规范是这样说的",但更深层次的原因是在某些非x86上,非ARM系统函数存储在物理上不同的内存区域而不是数据,并且指针具有非常不同的二进制表示比常规指针.

一些重量级的方法来打印出函数指针,但正如你所看到的,这并不容易.

独立地,你应该如何打印出函数指针的大小?试试这个,使用%zu修饰符,用于size_ts:

printf("Function pointer has size %zu\n", sizeof(&fun1));
Run Code Online (Sandbox Code Playgroud)

  • 更多未定义的行为:在标准C中,您实际上不能将`sizeof`应用于函数.将"sizeof"应用于函数类型的表达式是一种约束违规,并且在这种情况下,函数类型的表达式特别不会转换为指针.([N1548草案](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1548.pdf),第6.5.3.4和6.3.2.1节.) (6认同)