c - setjmp/longjmp 失败

标签 c setjmp

一段代码在这里

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/

相关文章:

CodeBlocks 在修改代码后不刷新我的程序

c - 循环 C 中的位

c - 重写 C 中的函数调用

c - 验证 c 中的输入数量

c - 在c中设置跳转和跳远代码流

c - linux C语言。 setjmp longjmp 报警

c - 使用 setjmp 和 longjmp 时,jmp_buf 中的实际内容是什么?

c - %d 在 c 中期望 int*

未修改的本地地址是否会在 setjmp/longjmp 中损坏?

c++ - 如何在 C++ 中(计算)goto 和 longjmp?