浅析C语言中的setjmp与longjmp函数

 更新时间:2013年09月10日 08:44:51   作者:  
以下是对C语言中的setjmp与longjmp函数进行了详细的介绍,需要的朋友可以过来参考下

setjmp和longjmp是C语言独有的,只有将它们结合起来使用,才能达到程序控制流有效转移的目的,按照程序员的预先设计的意图,去实现对程序中可能出现的异常进行集中处理。

先来看一下这两个函数的定义吧:

setjmp和longjmp的函数原型在setjmp.h中

函数原型:
int setjmp(jmp_buf envbuf);

setjmp函数用缓冲区envbuf保存系统堆栈的内容,以便后续的longjmp函数使用。setjmp函数初次启用时返回0值。

void longjmp(jmp_buf envbuf, int val);

longjmp函数中的参数envbuf是由setjmp函数所保存的堆栈环境,参数val设置setjmp函数的返回值。longjmp函数本身是没有返回值的,它执行后跳转到保存envbuf参数的setjmp函数调用,并由setjmp函数调用返回,此时setjmp函数的返回值就是val。

上面的说明有点拗口,通俗的解释是:先调用setjmp,用变量envbuf记录当前的位置,然后调用longjmp,返回envbuf所记录的位置,并使setjmp的返回值为val。当时用longjmp时,envbuf的内容被销毁了。其实这里的“位置”一词真正的含义是栈定指针。

接着让我们看一个小例子吧:

复制代码 代码如下:

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

jmp_buf buf;

banana(){
    printf("in banana() \n");
    longjmp(buf,1);

    printf("you'll never see this,because i longjmp'd");

}

main()
{
    if(setjmp(buf))
        printf("back in main\n");
    else{
        printf("first time through\n");
        banana();
    }

}


这段代码的打印结果是:
first time through
in banana()
back in main

仔细看一下应该更能体会这对函数的作用了吧。

setjmp/longjmp的最大用处是错误恢复,类似try ...catch...

他们的功能比goto强多了,goto只能在函数体内跳来跳去,而setjmp/longjmp可以在到过的所有位置间。

相关文章

  • C语言中如何通过指针参数返回值

    C语言中如何通过指针参数返回值

    这篇文章主要介绍了C语言中如何通过指针参数返回值问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 基于C语言实现简易扫雷游戏

    基于C语言实现简易扫雷游戏

    这篇文章主要为大家详细介绍了基于C语言实现简易扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下<BR>
    2022-01-01
  • C++线程之thread详解

    C++线程之thread详解

    这篇文章主要为大家详细介绍了C++线程中的thread,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • 在QT5中实现求两个输入值的和并输出(实例)

    在QT5中实现求两个输入值的和并输出(实例)

    下面小编就为大家带来一篇在QT5中实现求两个输入值的和并输出(实例)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • C++ assert()函数用法案例详解

    C++ assert()函数用法案例详解

    这篇文章主要介绍了C++ assert()函数用法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • c++ 智能指针基础详解

    c++ 智能指针基础详解

    这篇文章主要介绍了c++ 智能指针基础的相关资料,帮助大家更好的理解和学习使用c++,感兴趣的朋友可以了解下
    2021-02-02
  • C语言使用广度优先搜索算法解决迷宫问题(队列)

    C语言使用广度优先搜索算法解决迷宫问题(队列)

    这篇文章主要介绍了C语言使用广度优先搜索算法解决迷宫问题,结合迷宫问题分析了C语言队列广度优先搜索算法的相关使用技巧,需要的朋友可以参考下
    2017-09-09
  • Qt QTableWidget基本操作及使用

    Qt QTableWidget基本操作及使用

    QTableWidget 是 Qt 中的表格组件类。很类似于VC、C#中的DataGrid,本文就详细来介绍一下Qt QTableWidget基本操作及使用,感兴趣的可以了解一下
    2021-11-11
  • C语言实现字符串操作函数的实例

    C语言实现字符串操作函数的实例

    这篇文章主要介绍了C语言实现字符串操作函数的实例的相关资料,开发程序的时候经常使用到一些字符串函数,例如求字符串长度,拷贝字符串……,需要的朋友可以参考下
    2017-08-08
  • C基础 mariadb处理的简单实例

    C基础 mariadb处理的简单实例

    下面小编就为大家带来一篇C基础 mariadb处理的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06

最新评论