setjmp and longjmp

来源:互联网 发布:暖气片安装 知乎 编辑:程序博客网 时间:2024/05/29 08:41

setjmp, sigsetjmp - save stack context for nonlocal goto

1.作用

C中我们不能goto一个其他函数离得label,我们必须使用setjmplongimp来完成这种类型的branching

2.stack frame

每个function中的自动变量都保存在stack frame

系统内部并有没有支持stack的硬件,C的实现可能会使用链表来实现stack frames

3.example:多层嵌套的程序

figure 7.10
问题:如果内部深层次的函数出现了错误,会一层层返回。而使用setjmplongjmp能解决这个问题。

5.原型

#include <setjmp.h>int setjmp(jmp_buf env);//Returns: 0 if called directly, nonzero if returning from a call to longjmpvoid longjmp(jmp_buf env, int val);

setjmp的参数env是特殊的能保存所有值的数组。setjmp第一次返回0,之后调用longjmp后,会返回longjmpval值。

下图是调用longjmp后的stack frames
figure7.12

6. automatic,register and volatile variables

值是否回退取决于具体的实现

在完全优化的情况下:
如果不希望变量值回退(roll back)到第一次调用setjmp之前的值,需要加上volatile或者是static变量

为register变量和auntomatic变量会回退到调用setjmp之前的值

举例说明

例如自动变量 int a = 10,在调用setjmp之后的一段时间里a的值变成了66。后来出现错误调用了longjmp,这时候从setjmp处返回。此时a的值回退为之前的10。如果a为volatile变量,那么值仍然为66。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 5个月猫咪嘴巴臭怎么办 灿盛入伍柳岩怎么办 手机电用得快怎么办 身份证过期7个月怎么办 耳洞总是有臭味怎么办 口琴24孔吹不准怎么办 狗狗反胃吐白沫怎么办 2岁宝宝牙齿被腐蚀怎么办 2岁宝宝乳牙腐蚀怎么办 1岁宝宝门牙腐蚀怎么办 3岁宝宝有蛀牙怎么办 3岁宝宝乳牙腐蚀怎么办 三岁宝宝烂牙怎么办 宝宝牙被腐蚀了怎么办 嗓子声音变粗了怎么办 玩网游钱被骗了怎么办 家里的白墙脏了怎么办 月经弄到床垫上怎么办 出租房墙面太脏怎么办 苹果6镜头模糊了怎么办 6s前摄像头进灰怎么办 手机镜头进灰了怎么办 6s摄像头进灰了怎么办 7plus摄像头进灰怎么办 苹果喇叭进灰了怎么办 苹果7摄像头进灰怎么办 锁眼里胶水堵了 怎么办 锁眼被牙签堵了怎么办 锁孔被胶水堵了怎么办 快手上不了同城怎么办 昌珉入伍宋茜怎么办 嗓子里卡了鱼刺怎么办 在餐厅吃到虫子怎么办 在餐厅吃出虫子怎么办 孕妇被虫子咬了怎么办 吃外卖吃到虫子怎么办 杯子盖拧错位了怎么办 身边有吸毒的人怎么办 如果牛难产了怎么办要 牛难产拉不出来怎么办 老公发现老婆有外遇怎么办