将 jmp_buf 声明为指针

发布于 2024-09-06 23:40:54 字数 528 浏览 1 评论 0原文

我试图将 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)

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

I'm tring to define jmp_buf as pointer and using it in nested longjmp(s).as follow:

 ...
jmp_buf *bfj;
...

and then writing if else:

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

and somewhere else using the stored bfj to longjmp

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

where DS[TOP].int_val is where I stored it.
as it may seems clear,I want to do nested gotos and returns using stored bfj.
but well when I try to debug I get "unhandeled exception". I get this at the very starting point:

if( setjmp(*bfj) == 0)

I would be pleased if someone would tell the solution.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

葬﹪忆之殇 2024-09-13 23:40:54

从您的代码来看,您实际上并未为 jmp_buf 分配内存。您可以执行以下操作:

  1. 使用 new 动态分配您的 jmp_buf,并在使用完毕后将其删除
  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 代替。

From your code, you are not actually allocating memory for your jmp_buf. There are a couple of things you can do:

  1. Dynamically allocate your jmp_buf with new and you will want to delete it when you are done with it
  2. Put the jmp_buf on the stack jmp_buf bfj; and when you want it's pointer, you would take it's address with &bfj.

So, #1 would look like:

jmp_buf *bfj = new jmp_buf;
...

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

while #2 would look like:

jmp_buf bfj;
...

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

Another potential issue is that you should never cast a pointer to an int as a pointer may take more memory then an int (this happens on the common 64 bit programming models). If you can't store the pointer directly, you should use intptr_t instead.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文