我认为你混淆了命名和定义函数指针。我会指出,如果你写了
void func0(void) { printf( "0\n" ); }
void (*func0)(void);
你实际上有两个完全不相关的对象,同名func0。第一个func0 是一个函数,第二个func0 是一个变量,类型为pointer-to-function。
假设你声明了你的 变量 func0 全局(在任何函数之外),它将自动初始化为零,因此编译器会读取你的行
void (*func0)(void);
作为
void (*func0)(void) = NULL;
因此变量func0 将使用值NULL 进行初始化,而在大多数系统上NULL 实际上是0。
您的调试器现在告诉您变量 func0 的值是0x0000,即0。所以这真的不足为奇。
关于“修复”的问题 - 好吧,我假设您需要一个函数指针,指向您的函数 func0,因此您可以执行以下操作:
void func0(void) { printf( "0\n" ); }
void (*pFunc)(void) = func0;
甚至更好(尽管在大多数编译器上不是必需的)您可以编写
void (*pFunc)(void) = &func0;
所以你初始化你的变量pFunc(我强烈建议重命名它!)指向func0。更精确一点:您获取函数func0 的地址&... 并将此值分配给您的变量pFunc。
现在您可以通过以下方式“调用”函数指针(即调用函数指针指向的函数):
pFunc(); //will call function func0