【问题标题】:what does null function pointer in C mean?C中的空函数指针是什么意思?
【发布时间】:2012-04-04 15:27:20
【问题描述】:

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

void (*func0)(void);

这也是定义的:

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

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

【问题讨论】:

  • 第一行定义了一个函数指针,没有初始化,第二行定义了一个恰好同名的函数。

标签: c function pointers


【解决方案1】:

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

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

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

然后你可以分配给func0:

func0 = &MyFunction;

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

现在你可以通过函数指针调用函数了:

func0();

【讨论】:

    【解决方案2】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 2011-02-04
      • 2016-03-06
      • 1970-01-01
      • 1970-01-01
      • 2021-07-31
      • 2020-11-04
      • 1970-01-01
      • 1970-01-01
      • 2013-03-28
      相关资源
      最近更新 更多