• setjmp在非主函数中调用


      一个进程的正常结束方式应当是从main函数调用exit返回(一般情况下),若是进程在main函数中调用longjmp进入了其他函数会发生什么情况呢?

      程序的逻辑布局一般包括代码段、数据段、栈、堆...代码段是程序的指令集合。当一个函数被调用的时候,当前执行指令会跳转到被调用函数所对应代码段。而在跳转之前,会开辟一个该函数的栈帧,函数的返回地址(即当该函数执行完所应返回的地址)以及函数中所有的局部变量都会被保存于此栈,而这所有的动作被执行的前提是该函数显式的被调用。那么回到刚才的问题,在main函数中调用longjmp进入其他函数的时候,该函数不是被显示的调用,所以,该函数没有对应的栈帧,没有返回地址,什么都没有。当该函数所有的指令都被执行完成的时候,与该函数代码段相邻的数据会被当成指令执行,当这数据不是指令的时候就会引发段错误。

    程序:

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

    jmp_buf jmpbuf;

    void test_fun()
    {
      if (setjmp(jmpbuf) != 0)
        printf("error\n");
    }

    int main(int argc, char* argv[])
    {
      test_fun();
      longjmp(jmpbuf, 1);
      exit(0);
    }

    运行结果:

    error
    段错误

  • 相关阅读:
    uniapp 请求附近地址列表
    uniapp 图片视频上传
    城市定位
    日历签到
    uniapp拼团倒计时函数
    时间过滤器
    倒计时函数
    vuex的使用
    毛玻璃效果
    Pullword 中文分词
  • 原文地址:https://www.cnblogs.com/liuyang1012525/p/2280125.html
Copyright © 2020-2023  润新知