【C】——setjmp练习

本文深入探讨了C语言中setjmp和longjmp函数的使用方法,通过实例展示了如何在程序中实现跳转逻辑,特别关注了函数之间的调用和返回值的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 #include<setjmp.h>
2 
3 int setjmp(jmp_buf env);
4     返回值:若直接调用则返回0,若从longjmp调用返回则返回非0值
5 
6 void longjmp(jmp_buf env, int val);

  在希望返回的位置调用setjmp,直接调用该函数返回值为0;参数env的类型是一个特殊类型jmp_buf。这一数据类型是某种形式的数组,其中存放在调用longjmp时能用来恢复栈状态的所有信息。

  longjmp的两个参数,第一个是在调用setjmp时所用的env;第二个参数是具有非零值的val,它将成为从setjmp处返回的值。使用第二个参数的原因是对于一个setjmp可以有多个longjmp。

  

 1 #include<stdio.h>
 2 #include<setjmp.h>
 3 #include<stdlib.h>
 4 
 5 jmp_buf jmpbuffer;
 6 
 7 void prnt2()
 8 {
 9     printf("this prnt2\n");
10 
11     longjmp(jmpbuffer, 2);    //每次调用函数的第二个参数不同,这是用来区分是哪个函数调用的longjmp
12 }
13 
14 void prnt1()
15 {
16     printf("this prnt1\n");
17     longjmp(jmpbuffer, 1);
18     prnt2();
19 }
20 
21 int main()
22 {
23 /*
24     if(setjmp(jmpbuffer) == 1){
25         printf("this is print1's longjmp\n");
26         exit(0);
27     }
28     if(setjmp(jmpbuffer) == 2){
29         printf("this is print2's longjmp\n");
30         exit(0);
31     }
32 */
33     switch(setjmp(jmpbuffer)){
34     case 0: printf("setjmp seccuss\n");    break;
35     case 1: printf("print1's longjmp\n");    exit(0);    break;
36     case 2: printf("print2's longjmp\n");     exit(0);    break;
37     }        
38     printf("this main\n");
39     prnt1();
40 
41     exit(0);
42 }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值