如题,源于对博主bigloomy的学习
先看代码
#include <stdio.h>
#include <setjmp.h>
jmp_buf buf;
void error_code(void)
{
longjmp(buf,1);
}
int main()
{
double a,b;
printf("请输入被除数:");
scanf("%lf",&a);
printf("请输入除数:");
if(setjmp(buf)==0)
{
scanf("%lf",&b);
if(0==b)
<span style="white-space:pre"> </span>error_code();
printf("相除的结果为:%f\n",a/b);
}
else
printf("出现错误除数为0\n");
return 0;
}
runing:
发现代码执行流被改变了,真是神奇
看看维基百科怎么解释的
setjmp.h是C标准函数库中提供“非本地跳转”的头文件:控制流偏离了通常的子程序调用与返回序列。互补的两个函数setjmp与longjmp提供了这种功能。
jmp_buf
就是一个指针类型,在每次setjmp(buff)时,就是将此处代码的EIP保存起来,
执行longjmp(buff,num)就是跳转到setjmp设置的程序断点处,并返回num参数,放setjpm再执行一次,并返回num参数。
为此做一个实验
int main( void )
{
int value;
char str[50];
int cnt=0; //增加计数
value = setjmp( buf );
if( value == 0 )
{
func1();
}
printf("cnt %d\n",cnt++); //打印
running
cnt 0
func1 return value:1
cnt 1
func2 return value:2
cnt 2
func3 return value:3
这样可以说明