C中的空函数指针是什么意思?

假设我们有一个函数指针:

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