1.显示调用首地址为0的例程:(*(void(*)())0)()

显示调用首地址为0的例程的表达式为:(*(void(*)())0)()

分两步分析:

  1. 假定变量fp是一个函数指针,调用方法如下:(*fp)();

因为fp是一个函数指针,那么*fp就是该指针指向的函数,所以(*fp)()就是调用该函数的方式。ANSI C标准允许程序员将上式简写为fp()。()的运算符高于*。

  2.使用具体的函数指针替换fp,此处将0做类型强制转换,转换为函数指针,替换fp。

对一个常数进行类型转换,只需在变量声明中将变量名去掉即可。如果fp是一个指向返回值为void类型的函数的指针,那么(*fp)()的值为void,fp的声明如下:

void (*fp)();将变量名去掉,将0转换为"指向返回值为void的函数的指针"类型这样写:(void(*)())0

因此,可以用(void(*)())0替换fp,从而得到:

(*(void(*)())0)();

使用typedef声明更加便于理解。

typedef void(*funcptr)();     //相当于typedef void (*)()  funcptr

((*funcptr)0)();

2.signal函数声明理解:void(*signal(int, void(*)(int)))(int)

从三个方面理解:返回值类型、函数指针以及参数。

signal函数的返回值类型是一个指向调用前的用户定义信号处理函数的指针,

假定特定信号处理函数的声明如下:

void sigfunc(int);

假定sfp为指向sigfunc的函数指针,则*sfp就代表了sigfunc函数,因此可以如下声明sfp:

void (*sfp)(int);

signal的参数列表是(int,sigfunc), 返回值是sigfunc,所以signal可以声明如下:

sigfunc signal(int, sigfunc)

替换sigfunc,即:void(*sfp)(int) signal(int, void(*sfp)(int))

去掉变量名,即:void (*)(int) signal(int, void(*)(int))

调顺序,即:void (*signal(int, void(*)(int)))(int)

使用typedef声明更加便于理解。

typedef void (*HANDLER) (int);

HANDLER signal (int, HANDLER);

理解函数声明--signal函数的声明的更多相关文章

  1. 如何理解signal函数声明

    Signal函数用起来其实很简单,但是回头看看他的声明,相信会有很多人表示费解.自己也在这个问题中纠结了好几年了,今天终于弄明白,很是兴奋,一起分享一下. 先看函数原型:void (*signal(i ...

  2. 简单理解函数声明(以signal函数为例)

    这两天遇到一些声明比较复杂的函数,比如signal函数,那我们先简单说说signal函数的用法:(参考<c陷阱与缺陷>) [signal:几乎所有c语言程序的实现过程中都要用到signal ...

  3. signal函数的原型声明void (*signal(int signo, void (*fun(int))))(int)分析

    转:http://blog.sina.com.cn/s/blog_4850a7880100hnam.html void (*signal(int signo, void (*fun(int))))(i ...

  4. Signal ()函数详细介绍 Linux函数

    http://blog.csdn.net/ta893115871/article/details/7475095 Signal ()函数详细介绍 Linux函数 signal()函数理解 在<s ...

  5. Signal ()函数详细介绍 Linux函数(转)

    Signal ()函数详细介绍 Linux函数 收藏人:紫火神兵     2012-09-27 | 阅:5659  转:22    |   来源   |  分享               signa ...

  6. 【VS开发】程序如何捕捉signal函数参数中指定的信号

    当说到signal的功能时,我们都知道它会捕捉我们所指定的信号,然后调用我们所指定的信号处理函数.但它是如何捕捉我们指定的信号的呢?下面我就以msdn上关于signal的example为例,说明sig ...

  7. 信号之signal函数

    UNIX系统的信号机制最简单的接口是signal函数.signal函数的功能:为指定的信号安装一个新的信号处理函数. #include <signal.h> void (*signal(i ...

  8. signal函数、sigaction函数及信号集(sigemptyset,sigaddset)操作函数

    信号是与一定的进程相联系的.也就是说,一个进程可以决定在进程中对哪些信号进行什 么样的处理.例如,一个进程可以忽略某些信号而只处理其他一些信号:另外,一个进程还可以选择如何处理信号.总之,这些总与特定 ...

  9. 深入理解,函数声明、函数表达式、匿名函数、立即执行函数、window.onload的区别.

    一.函数声明.函数表达式.匿名函数1.函数声明:function fnName () {…};使用function关键字声明一个函数,再指定一个函数名,叫函数声明. 2.函数表达式 var fnNam ...

随机推荐

  1. 导入现有java工程

    1)错误:点击File-->open File 这样只能导入单个文件: 2)正确:File-->Import--> 然后下一步下一步即可.

  2. K8s+dashboard安装部署【h】

    系统安装使用虚拟机安装两个centos系统,在/etc/hosts里增加两行192.168.140.128 kuber-master192.168.140.129 kuber-node1 关闭防火墙s ...

  3. SVN 服务器 配置

    1.目录结构 2.用户分配 3.目录权限 4.linux下的SVN服务器 5.配置svnserver.conf 注意左边不要有空格 注意文件的权限 chmod -R 777 /opt/svn/blue ...

  4. oracle+mybatis批量插入踩坑记

    最近在项目中需要使用oracle+mybatis批量插入数据,因为自增主键,遇到问题,现记录如下: 一.常用的两种sql写法报错 1.insert ... values ... <insert ...

  5. javaweb期末项目-stage1-part1-需求分析(Requirements analysis)

    需求分析文档.rar-下载 说明:解压密码为袁老师的全名拼音(全小写) 相关链接: 项目结构:https://www.cnblogs.com/formyfish/p/10828672.html 需求分 ...

  6. 安装neutron

    在控制节点上执行 controllerHost='controller' MYSQL_PASSWD='m4r!adbOP' RABBIT_PASSWD='0penstackRMQ' NOVA_PASS ...

  7. day16 模块导入及环境变量

    """ 今日内容: 1.模块 2.模块的导入 3.环境变量sys.path 4.模块间的相互调用 """ """ ...

  8. 使用JedisPool资源池操作Redis,并进行性能优化

    一.使用方法 ----------------------------------------- private volatile static JedisPool pool = null; //本地 ...

  9. [转帖]国内拉取google kubernetes镜像

    国内拉取google kubernetes镜像 2019年04月19日 01:19:03 willblog 阅读数 4231 标签: kubernetes 更多 个人分类: kubernetes   ...

  10. springboot 论坛项目

    项目演示地址:http://www.mawen.co/ 快速搭建sprintboot项目 运行第一个springboot项目 leaf package hello; import org.spring ...