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)
| 归档时间: |
|
| 查看次数: |
148 次 |
| 最近记录: |