用setjmp和longjmp實現跳轉

丟的錢找到了發表於2018-03-25
函式定義在setjmp.h中。
int setjmp(jmp_buf buf);
setjmp函式用緩衝區buf儲存系統堆疊的內容,以便後續的longjmp函式使用。setjmp函式初次啟用時返回0。
void longjmp(jmp_buf buf, int val);
longjmp函式中的引數buf是由setjmp函式所儲存的堆疊環境,引數val設定setjmp函式的返回值。
longjmp函式本身是沒有返回值的,它執行後跳轉到儲存envbuf引數的setjmp函式呼叫,並由setjmp函式呼叫返回,此時setjmp函式的返回值就是val。
#include <stdio.h>
#include <setjmp.h>

jmp_buf buf;

void func()
{
    printf("跳轉並返回1\n");
    longjmp(buf,1);
    printf("已經回到main函式了,這裡到不了\n");
}

int main(int argc, char const *argv[])
{
    int res = setjmp(buf);
    if (res == 0)
    {
        printf("第一次\n");
        func();
    }
    else if (res == 1)
    {
        printf("從longjmp函式跳轉回來\n");
    }
    return 0;
}
複製程式碼

相關文章