C标准库学习之<setjmp.h> ——非局部跳转

#include <stdio.h>
#include <time.h>
#include <setjmp.h> // 非局部跳zhuan

jmp_buf jump_buffer;

/*
=========================================================
time:           2017年1月25日14:37:54
objective:      test C language's  head file of <setjmp.h> 
version:        Microsoft Visual C++
author:         ChenFei
remark:         日文system  有些字没法打要用pin音代替
=========================================================
*/

/*
    setjmp( jmp_buf ) 相当于跳zhuan点,   jmp_buf wei宏定yi lei型
    longjmp(jmp_buf, int) 相当于 goto ,    int wei 返回gei setjmp( jmp_buf ) 的参数

    setjmp() diao用 jmp_buf, 返回zhi wei 0,longjmp() diao用 jmp_buf, 返回zhi wei其参数。

    main 中的 setjmp(jump_buffer) -> func1 中的 func() --
    -> func 中的 longjmp(jump_buffer, 2); -> mian 中的 a = setjmp(jump_buffer); --
    -> a = 2;
*/

void func(void)
{
         printf("Before calling longjmp\n");
         longjmp(jump_buffer, 2);
         printf("After calling longjmp\n");
}
void func1(void)
{
         printf("Before calling func\n");
         func();
         printf("After calling func\n");
}

int main(void)
{   
    int a;
    a = setjmp(jump_buffer);
    printf("%d\n",a);
    if (a == 0){
        printf("%d\n",a);
        printf("first calling set_jmp\n");
        func1();
     }else {
        printf("%d\n",a);
        printf("second calling set_jmp\n");
     }

    return 0;
}

以下文字为转载

通过上面这个简单例子的运行结果可以看出。main函数运行的setjmp()宏调用,将当前程序点的系统状态信息保存到全局变量jump_buffer中,然后返回结果0。于是,代码打印出字符串”first calling set_jmp”,然后调用函数func1()。在函数func1中,先打印字符串”Before calling func”,然后去调用函数func()。现在程序控制流转到func函数中,函数func先打印字符串“Before calling longjmp”,然后调用函数longjmp。*这时候关键点到了!!!***longjmp函数将main函数中setjmp()宏调用设置在全局变量jump_buffer中的系统状态信息恢复到系统的相应寄存器中,导致程序的控制流跳转到了main函数中setjmp()宏调用所在的程序点,此时相当于第二次进行setjmp()宏调用,并且此时的setjmp()宏调用的返回不再是0,而是传递给函数调用longjmp()的第二个参数1。于是程序控制流转到main函数中if语句的else部分执行,打印字符串“second calling set_jmp“。最后,执行main函数中的语句“reture 0;”返回,程序运行结束退出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值