假设我们有一个函数指针:
void (*func0)(void);
这也被定义:
void func0(void) { printf( "0\n" ); }
但是说,在某些时候我们尝试以某种方式访问函数指针,那么如果 MS VS 调试器在我进入代码时显示 func0 实际上指向 0x0000,这意味着什么?另外,请让我知道最好的解决方法是什么?谢谢。
取消引用空指针是未定义的行为。修复只是为了确保指针指向适当的函数。
在你的情况下,你想要这样的东西:
void MyFunction(void)
{
printf( "0\n" );
}
然后你可以分配给func0
:
func0 = &MyFunction;
请注意,我为函数指针变量和实际函数使用了不同的名称。
现在您可以通过函数指针调用该函数:
func0();
我认为您正在混淆命名和定义函数指针。我会指出,如果你写
void func0(void) { printf( "0\n" ); }
void (*func0)(void);
你实际上有两个完全不相关的同名对象func0
。第一个func0
是函数,第二个func0
是函数指针类型的变量。
假设您全局声明了变量 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