3 回答
TA贡献1784条经验 获得超2个赞
唯一合法的方法是使用字符类型访问组成指针的字节。像这样:
#include <stdio.h>
int main() {
int (*funcptr)() = main;
unsigned char *p = (unsigned char *)&funcptr;
size_t i;
for (i = 0; i < sizeof funcptr; i++)
{
printf("%02x ", p[i]);
}
putchar('\n');
return 0;
}
void *像Dreamlax的答案一样,将函数指针修饰为或任何非字符类型都是不确定的行为。
组成函数指针的那些字节实际上意味着什么取决于实现。例如,它们可以仅代表函数表的索引。
TA贡献1785条经验 获得超4个赞
使用联合可以避免警告/错误,但是结果仍然是(最有可能)未定义的行为:
#include <stdio.h>
int
main (void)
{
union
{
int (*funcptr) (void);
void *objptr;
} u;
u.funcptr = main;
printf ("%p\n", u.objptr);
return 0;
}
您可以printf ("%i\n", (main == funcptr));使用if语句比较两个函数指针(例如),以测试它们是否相等(我知道这完全违反了目的,并且很可能是无关紧要的),但实际上输出了函数指针的地址,发生什么情况取决于目标平台的C库和编译器的供应商。
- 3 回答
- 0 关注
- 459 浏览
添加回答
举报