一段代码在这里
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'中存储了什么样的值,谁能解释一下?
最佳答案
setjmp()
和 longjmp()
通过记录堆栈帧位置来工作。如果您在 Sub_Func()
中记录堆栈帧但在调用 longjmp()
之前从函数返回,则堆栈帧不再有效。
longjmp()
应在与 setjmp()
相同的函数中调用(子函数可以)。
关于c - setjmp/longjmp 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11139744/