美文网首页C语言C++
函数指针和void * 之间的转换

函数指针和void * 之间的转换

作者: 千山万水迷了鹿 | 来源:发表于2017-09-16 13:16 被阅读896次

函数指针函数名转换成内存地址调用

(*(void(*) ())0)();
这是《C Traps and Pitfalls》这本经典的书中的一个例子。
第一步:void(*) (),可以明白这是一个函数指针类型。这个函数没有参数,没有返回值。
第二步:(void(*) ())0,这是将0 强制转换为函数指针类型,0 是一个地址,也就是说一个函数存在首地址为0 的一段区域内。
第三步:(*(void(*) ())0),这是取0 地址开始的一段内存里面的内容,其内容就是保存在首地址为0 的一段区域内的函数。
第四步:(*(void(*) ())0)(),这是函数调用。

一个列子

#include <iostream>
using namespace std;

typedef struct {
      void*     method;    //
} Method;

void test(){
    cout<<"test function invoke"<<endl;
}

int main()
{  
    //结构体初始化
    //把函数指针强制类型转换成void指针(void*)
    //然后赋值给method变量
    Method m ={(void *)test};
    //调用的时候,把void*类型的指针强制类型转换成函数指针
    //然后以函数指针调用函数的方式调用这个函数
    //m.method 是函数的入口地址
    (*((void(*) ())(m.method)))();
   
    return 0;
}

相关文章

网友评论

    本文标题:函数指针和void * 之间的转换

    本文链接:https://www.haomeiwen.com/subject/lqiysxtx.html