关于(*(void(*)())0)()

    前段时间看了这本C Traps and Pitfalls,看到里面有这样的一个语句:
   (*(void(*)())0)();

    初看此语句,让我头皮发麻,不寒而栗呀,我看了好半天书,也只是一知半解,后来在下面两个论坛上分别发一个帖子问了一下:
http://bbs.chinaunix.net/viewthread.php?tid=891271&extra=page%3D2
http://www.vckbase.com/bbs/viewtopic2.asp?rid=2869084&sf=92&forumID=1&pg=4

    首先这是一个函数调用,但是一个特殊的函数调用,在我们普通的C语言程序中是没有任何意义的,甚至不能执行的,我在VC6的环境下写了一个测试例子:
int main()
{
     (*(void(*)())0)();
     return 0;
}

    编译是通过了,但是却在执行的过程中出现了错误。在Linux下也进行了测试,也是编译通过,但运行出现了错误。
    然而,这个并不代表它没有用,它在一些特殊的环境中是有用的,比如在地址0处设置了跳转或是中断处理函数之类的,那么这个函数调用就有用了。
    总结一下我自己的理解和网上网友的理解:
   
    这是一个函数调用,它调用的是地址为0的函数。
如果我们令 f =
*(void(*)())0
那么这个上面的语句可以写成 (f)(),也就是f();这很显然是一个函数调用
而 void(*)()是一个指针类型,它是一个参数为空而返回值为void (实际上也是空)的函数指针类型,(void(*)())0就是把0强制转换成为一个函数指针,
我们可以这样理解
typedef void(*pp)();
   (*(pp)0)();

(void(*)())0这个函数指针指向一个地址为0的函数,如果前面再加一个星号*,那么就是对这个函数的引用,即(*(void(*)())0)就代表了这个函数,后面再加一个()就是对该函数的调用。

Read: 754

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注