2014-01-07 58 views
0

嗨,我想问一下关于setjmp/longjmp。我试图寻找,但我unsucessuful ...两个独立的jmp_bufs如何工作?

#include <stdio.h> 
#include <setjmp.h> 

jmp_buf a, b; 

void jump() { 
    int aa = setjmp(a); 

    if (aa) 
    { 
     printf("Jump!\n"); 
    } 
    else 
    { 
     longjmp(b, 1); 
     printf("Should not happened...\n"); 
    } 

    printf("End of function!\n"); 
} 


int main(int argc, char** argv) { 
    int bb = setjmp(b); 

    if (bb) 
    { 
     longjmp(a, 1); 
     printf("Should not happened...\n"); 
    } 
    else 
    { 
     jump(); 
     printf("What here?\n"); 
    } 

    printf("Exit\n"); 
    return 0; 
} 

的问题是,最后的printf后会发生在跳跃()什么......我想这个代码,并将其变成无限循环。为什么?我虽然setjmp将存储环境数据,所以跳转功能应在原始调用后返回...我很安静困惑。感谢您的回复:)

回答

2

整个程序有未定义的行为。

  1. setjmp(b);存储堆栈状态。
  2. jump()被调用。
  3. `setjmp(a);'再次存储堆栈状态。
  4. longjmp(b, 1);将堆栈恢复到之前调用jump()之前的时间点。因此,存储在a中的状态现在无效。
  5. 继续执行if,main()
  6. longjmp(a, 1);被调用。哎哟。这会导致由于上述4而导致的未定义行为。

您的困惑可能是由于在Linux文档中对setjmp()的世界“return”稍微不精确的使用造成的。

如果调用setjmp()的函数返回,则堆栈上下文将失效。

在你的榜样,功能jump()没有以正常的方式返回,但效果是一样的:堆栈被“斩”第一longjmp()的状态jump()之前,这是一个回报也是。

+0

谢谢。你知道一些有用的页面或文献,我可以找到关于C和堆栈的更多信息吗?也许我对它的想象与现实稍有不同:) – jirizaj