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

use*_*265 2 c pointers function

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

void (*func0)(void);
Run Code Online (Sandbox Code Playgroud)

这也定义了:

void func0(void) { printf( "0\n" ); }
Run Code Online (Sandbox Code Playgroud)

但是说,在某些时候我们尝试以某种方式访问​​函数指针,然后如果MS VS调试器在我进入代码时显示func0实际上指向0x0000,这是什么意思?另外,还请告诉我什么是最好的解决方案?谢谢.

Dav*_*nan 8

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

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

void MyFunction(void)
{
    printf( "0\n" ); 
}
Run Code Online (Sandbox Code Playgroud)

然后你可以分配给func0:

func0 = &MyFunction;
Run Code Online (Sandbox Code Playgroud)

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

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

func0();
Run Code Online (Sandbox Code Playgroud)


Ant*_*les 5

我认为你正在混淆命名定义函数指针.我只想指出,如果你写

void func0(void) { printf( "0\n" ); }
void (*func0)(void);
Run Code Online (Sandbox Code Playgroud)

实际上你有两个完全不相关的同名对象func0.第一个func0函数,第二个func0是具有类型指针到函数的变量.

假设您全局声明了您的变量 func0(在任何函数之外),它将自动归零,因此编译器将读取您的行

void (*func0)(void);
Run Code Online (Sandbox Code Playgroud)

void (*func0)(void) = NULL;
Run Code Online (Sandbox Code Playgroud)

因此变量func0将使用值初始化NULL,并且在大多数系统上NULL实际上将是0.

你的调试器现在告诉你你的变量 func0有值0x0000,即0.所以这真的不是什么大惊喜.

关于"修复"的问题 - 好吧,我假设您需要一个指向您的函数的函数指针func0,因此您可以执行以下操作:

void func0(void) { printf( "0\n" ); }
void (*pFunc)(void) = func0;
Run Code Online (Sandbox Code Playgroud)

甚至更好(虽然大多数编译器没有必要)你可以写

void (*pFunc)(void) = &func0;
Run Code Online (Sandbox Code Playgroud)

所以你初始化你的变量pFunc(我强烈建议重命名!)指向func0.更精确一点:您获取&...函数的地址func0并将此值赋给变量pFunc.

现在你可以通过以下方式"调用"函数指针(这意味着调用函数指针指向的函数):

pFunc(); //will call function func0
Run Code Online (Sandbox Code Playgroud)