关于函数指针的一点小研究
文章目录
【注意】最后更新于 June 12, 2021,文中内容可能已过时,请谨慎使用。
C语言里有个特殊的指针,称为函数指针。这个东西比较可爱的一点是它本身是指向某函数的,可以用它来调用函数。
但是语言上有个说法,是一切未初始化的变量是bug的来源。那么函数指针初始化为什么好呢?
最最直接的想法是NULL。NULL当然没错了,但是它还不够智能,运行的时候闷头来个段错误,让人丈二和尚摸不着头脑,究竟是哪个指针跑飞了呢?
于是我简单的研究了一下。
首先定义了一个函数test:
|
|
这个函数很简单,就是在屏幕输出一行文字。
如果直接定义它的函数指针,那就是void (*point)() = test;
可是咱们说的是把它当做任意函数指针的地址。于是试了一下:
|
|
运行,OK!没有问题。
这样可以通过把函数指针初始化为报错的函数,可以调用exit终止掉非法调用,可以记录日志,可以做任何你想要做的事情,甚至忽略错误,让程序飞一会;或者添加第一个参数,记录下其余参数的数量,还可以把所有的参数都记录下来,以供改进。
不过……最好还是通过它重新初始化的好。为啥呢?因为test函数不消耗参数,栈内多了两个参数啊,这些参数都消耗不掉了。总之这对于程序的运行百害无一利,更何况程序指针已经飞了,继续跑基本也不正确了。