免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1629 | 回复: 4
打印 上一主题 下一主题

[C] 帮忙看段代码 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-04-18 10:56 |只看该作者 |倒序浏览

  1. int j =0;
  2. jmp_buf env;
  3. int main()
  4. {
  5.     int i,k=0;
  6.     i = setjmp(env);
  7.     printf("setjmp=%d,j=%d,k=%d\n",i,j++,k++);
  8.     if (j>2)
  9.     {
  10.         exit(0);
  11.     }
  12.     sleep(1);
  13.     longjmp(env,2);
  14. }
复制代码
输出结果是
setjmp=0,j=0,k=0
setjmp=2,j=1,k=1
setjmp=2,j=2,k=2

注意看k变量,跳转函数不仅恢复程序执行位置,也恢复堆栈数据的取值 作为堆栈的整型k在程序跳转后,应该恢复原来的值啊 也即全是 0
为什么还是会递增呢 不解 请各位帮忙解释下

论坛徽章:
0
2 [报告]
发表于 2010-04-18 11:30 |只看该作者
longjmp(env,2); 之后会从i = setjmp(env);处开始执行。

论坛徽章:
0
3 [报告]
发表于 2010-04-18 11:32 |只看该作者
env中保存栈的指针,整个过程栈中的k变量没有没赋0过

论坛徽章:
0
4 [报告]
发表于 2010-04-18 12:51 |只看该作者
编译你的程序的时候加个优化把  -O2就可以了....

深究点的话 你需要了解auto  register volatile  static变量的区别.... 生命周期和存储问题

man setjmp说的很清楚放在存储器的变量将具有longjmp时的值...
不优化的话所有变量都是放在存储器里的,于是结果就是你上面看到的结果了
优化了的话 auto和register是放在寄存器里的,也就是你想要的结果了,注意全局 静态 和volatile变量是不受优化的影响的

论坛徽章:
0
5 [报告]
发表于 2010-04-18 12:58 |只看该作者
  1. [kenthy@kenthy c_c]$ gcc -Wall -o test test.c
  2. [kenthy@kenthy c_c]$ ./test
  3. setjmp=0,j=0,k=0
  4. setjmp=2,j=1,k=1
  5. setjmp=2,j=2,k=2
  6. [kenthy@kenthy c_c]$ gcc -Wall -O2 -o test test.c
  7. [kenthy@kenthy c_c]$ ./test
  8. setjmp=0,j=0,k=0
  9. setjmp=2,j=1,k=0
  10. setjmp=2,j=2,k=0
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP