2

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

void (*func0)(void);

这也被定义:

void func0(void) { printf( "0\n" ); }

但是说,在某些时候我们尝试以某种方式访问​​函数指针,那么如果 MS VS 调试器在我进入代码时显示 func0 实际上指向 0x0000,这意味着什么?另外,请让我知道最好的解决方法是什么?谢谢。

4

2 回答 2

8

取消引用空指针是未定义的行为。修复只是为了确保指针指向适当的函数。

在你的情况下,你想要这样的东西:

void MyFunction(void)
{
    printf( "0\n" ); 
}

然后你可以分配给func0

func0 = &MyFunction;

请注意,我为函数指针变量和实际函数使用了不同的名称。

现在您可以通过函数指针调用该函数:

func0();
于 2012-04-04T15:28:12.837 回答
6

我认为您正在混淆命名定义函数指针。我会指出,如果你写

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
于 2012-04-07T18:07:27.040 回答