2

jmp_buf をポインターとして定義し、ネストされた longjmp(s) で使用しようとしています。次のように:

 ...
jmp_buf *bfj;
...

そうでなければ書く:

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 は、保存した場所です。明らかなように、ネストされた goto を実行し、保存された bfj を使用して戻りたいと考えています。しかし、デバッグしようとすると、「未処理の例外」が発生します。私はまさに出発点でこれを取得します:

if( setjmp(*bfj) == 0)

どなたか解決策を教えていただけると幸いです。

4

1 に答える 1

2

コードから、実際にはメモリを割り当てていませんjmp_buf。あなたができることがいくつかあります:

  1. を動的に割り当てます。使い終わったら、それを使いたいと思うでしょうjmp_bufnewdelete
  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;

もう 1 つの潜在的な問題は、ポインターが int よりも多くのメモリを消費する可能性があるため、ポインターを にキャストしてはならないことですint(これは一般的な 64 ビット プログラミング モデルで発生します)。ポインタを直接格納できない場合は、intptr_t代わりに使用する必要があります。

于 2010-06-21T23:14:52.400 に答える