这里有一段代码
jmp_buf mark;
int Sub_Func()
{
int be_modify, jmpret;
be_modify = 0;
jmpret = setjmp( mark );
if( jmpret == 0 )
{
// sth else here
}
else
{
// error handle
switch (jmpret)
{
case 1:
printf( "Error 1\n");
break;
case 2:
printf( "Error 2\n");
break;
case 3:
printf( "Error 3\n");
break;
default :
printf( "Unknown Error");
break;
}
printf("after switch\n");
}
return jmpret;
}
void main( void )
{
Sub_Func();
// the longjmp after setjmp
longjmp(mark, 1);
}
结果是:
错误1
切换后
分段故障
我知道原因可能是longjmp跳回到以前的堆栈。但我不确定细节,以及'mark‘中存储了什么样的值,有谁能解释一下吗?
发布于 2012-06-21 13:57:11
setjmp()
和longjmp()
通过记录堆栈帧位置来工作。如果您在Sub_Func()
中记录了堆栈帧,但在调用longjmp()
之前从函数返回,则堆栈帧将不再有效。在与setjmp()
相同的函数中调用longjmp()
(子函数也可以)。
发布于 2012-06-21 13:59:03
您正在尝试返回到更深层次的函数。您只能将longjmp返回到较浅的函数。
因此,如果A调用setjmp
,然后调用B,那么B可以longjmp
回A。
但是如果A调用b,B调用setjmp
,B返回到A,则A不能 longjmp
回到B。
发布于 2012-06-21 14:15:43
您通过违反以下规则(7.13.2.1)调用了未定义的行为:
longjmp函数
使用相应的jmp_buf参数恢复在同一程序调用中最近一次调用setjmp宏所保存的环境。如果没有这样的调用,或者如果包含对SetJMP宏的调用的函数在过渡期间终止了execution217),或者如果对SetJMP宏的调用在具有可变修改的类型的标识符的范围内并且在过渡期间执行离开了该范围,则行为是未定义的。
217),例如通过执行返回语句,或者因为另一个longjmp _ or调用已经导致转移到嵌套调用集合中较早的函数中的setjmp调用。
简而言之,在已经返回的函数中,不能使用longjmp
跳转到setjmp
点。
https://stackoverflow.com/questions/11139744
复制相似问题