C语言:写个setjmp相关的小程序,百度百科的看不懂

#include<setjmp.h>//相信有经验的高手肯定能写出个更容易让人了解setjmp的短程序(附解释哦)... #include<setjmp.h>
//相信有经验的高手肯定能写出个更容易让人了解setjmp的短程序(附解释哦)
展开
 我来答
goode2008
2013-08-26 · TA获得超过471个赞
知道小有建树答主
回答量:175
采纳率:0%
帮助的人:212万
展开全部
#这是APUE 7.10节的例子,很好懂
#详细的参考原书吧,有对结果的详细分析,讲的肯定比我说的透彻

#include "apue.h"
#include <setjmp.h>

static void f1(int, int, int, int);
static void f2(void);

static jmp_buf jmpbuffer;
static int globval;

int
main(void)
{
int autoval;
register int regival;
volatile int volaval;
static int statval;

globval = 1; autoval = 2; regival = 3; volaval = 4; statval = 5;

if (setjmp(jmpbuffer) != 0) {
printf("after longjmp:\n");
printf("globval = %d, autoval = %d, regival = %d,"
    " volaval = %d, statval = %d\n",
    globval, autoval, regival, volaval, statval);
exit(0);
}

/*
 * Change variables after setjmp, but before longjmp.
 */
globval = 95; autoval = 96; regival = 97; volaval = 98;
statval = 99;

f1(autoval, regival, volaval, statval); /* never returns */
exit(0);
}

static void
f1(int i, int j, int k, int l)
{
printf("in f1():\n");
printf("globval = %d, autoval = %d, regival = %d,"
    " volaval = %d, statval = %d\n", globval, i, j, k, l);
f2();
}

static void
f2(void)
{
longjmp(jmpbuffer, 1);
}
追问
  •   longjmp(jmpbuffer, 1); 这句什么意思?

追答
这句意思就是返回setjmp那一点,参数 1 是返回给setjmp的值,用来标识是第一次调用setjmp设置跳转点(此时setjmp返回0)还是从longjmp返回的(此时setjmp返回longjmp的第二个参数)。
总体的思路就是:
1 程序开始直接调用setjmp设置一个返回点,函数返回值为0,它的参数是一个jmp_buf结构的变量env,存储用于恢复函数堆栈状态的信息;
2 在程序运行过程中,出现了你想返回到setjmp设置的那个返回点的时候,调用longjmp(env, val),env就是步骤1中使用的jmp_buf结构,val是个int,用来作为setjmp的返回值。
3 在setjmp调用的地方,要对其返回值判断,如果是0,则是设置返回点,如果非0,说明是从特定的longjmp处返回,这个返回值可以有多个,说明一个setjmp可以对应多个longjmp,就是可以从多个点返回到setjmp处。
另外,上面APUE的例子,是为了说明使用setjmp/longjmp时,不同的编译器优化选项对返回时函数栈状态的影响。
k951461404
2013-09-03
知道答主
回答量:67
采纳率:0%
帮助的人:18.6万
展开全部
c语言有识别各种语言世人又称c+有2000~2013帮助翻译网页其他国的语言
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式