【发布时间】:2017-12-07 14:49:38
【问题描述】:
首先,问题是:你有什么理由不能从函数中获取函数的地址?
#include <stdio.h>
struct foo {
void(*xf)(void);
int r;
} sFoo;
void func(void) {
sFoo.xf = func; /* <-- like this */
}
int main()
{
func();
printf("FuncPtr is: %p\n", sFoo.xf);
printf("FuncAddr is: %p\n", &func);
getchar();
return 0;
}
我想不出为什么它不应该在便携式上工作,但这并不意味着没有。我已经在 Windows 上使用 MinGW 和 MSVC 以及在 Ubuntu 上使用 gcc 对其进行了测试,并且效果很好。 C 标准几乎保持沉默,只是说 (C99 5.1.1.2) 函数引用在最终翻译阶段得到解决。
我的主要烦恼是我找不到任何确认这是标准行为的东西。过去我遇到过 cmets 说您 无法 从该函数中获取函数的地址,我当时认为这是伪造的,但实际上并没有到现在为止,有时间或倾向去实际检查一下。
【问题讨论】:
-
注意,带有
%p的打印函数指针是未定义的行为。没有用于打印函数指针的格式说明符。 -
地址和指针解引用运算符实际上对函数没有任何作用,所以
func、&func和*func都是一样的(其中func是一个函数)。使用%p打印除void *以外的任何内容都是非标准的。将函数指针转换为void *在技术上也是 UB。 -
它有效。已知函数是函数;因此它的名字是一个指向函数的指针
-
使用
%p,我们可以打印任何指针。无论它指向哪里以及输入哪个
标签: c language-lawyer