将jmp_buf指定为指针

时间:2010-06-21 22:50:28

标签: c++ longjmp

我想将jmp_buf定义为指针并在嵌套的longjmp(s)中使用它。如下:

 ...
jmp_buf *bfj;
...

然后写if else:

if( setjmp(*bfj) == 0){
DS[SP-2].int_val=(int)bfj;;
//to store the bfj
}else {}

和其他地方使用存储的bfj到longjmp

 bfj = (jmp_buf *)DS[TOP].int_val;
 longjmp(*bfj,1);

其中DS [TOP] .int_val是我存储它的地方。 因为它似乎很清楚,我想做嵌套的gotos并使用存储的bfj返回。 但是当我尝试调试时,我得到“unhandeled exception”。我从一开始就得到了这个:

if( setjmp(*bfj) == 0)

如果有人能说出解决方案,我会很高兴。

1 个答案:

答案 0 :(得分:2)

从您的代码中,您实际上并没有为jmp_buf分配内存。你可以做几件事:

  1. 使用jmp_buf动态分配new,并在完成后delete
  2. jmp_buf放在堆栈jmp_buf bfj;上,当您想要它的指针时,您可以使用&bfj取得它的地址。
  3. 所以,#1看起来像:

    jmp_buf *bfj = new jmp_buf;
    ...
    
    if( setjmp(*bfj) == 0){
    DS[SP-2].int_val=(intptr_t)bfj;
    

    虽然#2看起来像:

    jmp_buf bfj;
    ...
    
    if( setjmp(bfj) == 0){
    DS[SP-2].int_val=(intptr_t)&bfj;
    

    另一个潜在的问题是你永远不应该将指针强制转换为int,因为指针可能需要更多的内存然后是int(这在常见的64位编程模型上会发生)。如果无法直接存储指针,则应使用intptr_t代替。