указав jmp_buf в качестве указателя - PullRequest
2 голосов
/ 22 июня 2010

Я пытаюсь определить 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)

Я был бы рад, если бы кто-то сказал решение.

1 Ответ

2 голосов
/ 22 июня 2010

Из вашего кода вы фактически не выделяете память для вашего 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;

Другая потенциальная проблема заключается в том, что вам никогда не следует приводить указатель на int, так как указатель может занять больше памяти, чем int (это происходит наобщие 64-битные модели программирования).Если вы не можете сохранить указатель напрямую, вы должны использовать intptr_t.

...