setjmp_demo

【引用】

https://www.cnblogs.com/yangxunwu1992/p/5875254.html

【demo代码】

#include <stdio.h>
#include <setjmp.h>

void change(int r, int s, int a, int v);
jmp_buf state;

int main()
{

    register int r = 1;
    static   int s = 1;
    register  int a = 1;
    volatile int v = 1;

    if(setjmp(state)){
        printf("1 r:%4d s:%4d a:%4d v:%4d\n", r, s, a, v);
        return 0;
    }
    r = s = a = v = 999;
    change(r, s, a ,v);
    return 1;
}

void change(int r, int s, int a, int v)
{
    printf("2 r:%4d s:%4d a:%4d v:%4d\n", r, s, a, v);
    //r寄存器变量,跳转时r是setjmp时的值
    longjmp(state, 1);
}

执行结果

1)setjmp保存当前寄存器的值

2)调用longjmp跳转过去

【说明】

 

1) 声明jmp_buf

2) setjmp

调用函数保存在jmp_buf中的参数中

3)longjmp函数

说明:

使用相应的jmp_buf参数来恢复程序中宏setjmp最近一次调用保存的环境

函数返回值:

longjmp完成后,程序继续执行,就好像setjmp的调用返回了val的值

posted @ 2022-06-04 10:01  stupidstan2019  阅读(16)  评论(0编辑  收藏  举报