C语言里有个特殊的指针,称为函数指针。这个东西比较可爱的一点是它本身是指向某函数的,可以用它来调用函数。

  但是语言上有个说法,是一切未初始化的变量是bug的来源。那么函数指针初始化为什么好呢?

  最最直接的想法是NULL。NULL当然没错了,但是它还不够智能,运行的时候闷头来个段错误,让人丈二和尚摸不着头脑,究竟是哪个指针跑飞了呢?

  于是我简单的研究了一下。

  首先定义了一个函数test:

1
2
3
4
void test()
{
    printf("test!\n");
}

这个函数很简单,就是在屏幕输出一行文字。

如果直接定义它的函数指针,那就是void (*point)() = test;

可是咱们说的是把它当做任意函数指针的地址。于是试了一下:

1
2
3
void (*LynxArrayListInit) (LynxArrayList *myArrayList,
                            long increaseStep
                           ) = test;

运行,OK!没有问题。

  这样可以通过把函数指针初始化为报错的函数,可以调用exit终止掉非法调用,可以记录日志,可以做任何你想要做的事情,甚至忽略错误,让程序飞一会;或者添加第一个参数,记录下其余参数的数量,还可以把所有的参数都记录下来,以供改进。

  不过……最好还是通过它重新初始化的好。为啥呢?因为test函数不消耗参数,栈内多了两个参数啊,这些参数都消耗不掉了。总之这对于程序的运行百害无一利,更何况程序指针已经飞了,继续跑基本也不正确了。