2

我正在尝试将 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 是我存储它的位置。看起来很清楚,我想使用存储的 bfj 进行嵌套 goto 和返回。但是当我尝试调试时,我得到“未处理的异常”。我从一开始就明白了:

if( setjmp(*bfj) == 0)

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

4

1 回答 1

2

从您的代码中,您实际上并没有为您的jmp_buf. 您可以做几件事:

  1. 动态分配你jmp_buf的,当你完成时new你会想要delete
  2. 把 放在jmp_buf堆栈上jmp_buf bfj;,当你想要它的指针时,你会用它的地址&bfj

所以,#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;

另一个潜在的问题是,您永远不应该将指针转换为 an int,因为指针可能会比 int 占用更多的内存(这发生在常见的 64 位编程模型上)。如果你不能直接存储指针,你应该intptr_t改用。

于 2010-06-21T23:14:52.400 回答