前段时间看了这本C Traps and Pitfalls,看到里面有这样的一个语句:
(*(void(*)())0)();
初看此语句,让我头皮发麻,不寒而栗呀,我看了好半天书,也只是一知半解,后来在下面两个论坛上分别发一个帖子问了一下:
%3D2
首先这是一个函数调用,但是一个特殊的函数调用,在我们普通的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)就代表了这个函数,后面再加一个()就是对该函数的调用。
这是我根据网上的回帖以及我个人的理解总结出来的,如果有何错误的理解,望广大网友批评指正,同时感谢对我这个两个帖子回帖的各位网友。
阅读(1186) | 评论(0) | 转发(0) |