首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么setjmp/longjmp

为什么setjmp/longjmp
EN

Stack Overflow用户
提问于 2021-07-15 14:07:07
回答 1查看 289关注 0票数 4

我想使用setjmp/longjmp来重用主函数中的一些代码(注意:这只是一个练习,而不是我在现实世界中认真计划要做的事情)。下面的代码是我想出的:

代码语言:javascript
复制
#include <stdio.h>
#include <setjmp.h>
jmp_buf jmp_body, jmp_ret;
    
void func(void)
{
    if (setjmp(jmp_ret) == 0)
        longjmp(jmp_body, 1);
}

int main()
{
    int x = 0;
    if (setjmp(jmp_body) == 1) {
        printf("Body %d\n", ++x);
        longjmp(jmp_ret, 1);
    }
    func();
    func();
    func();
    return 0;
}

我预期此代码的工作方式如下:

  1. main()函数将记住“body”部分的位置,并使用if (setjmp(jmp_body) == 1)跳过它。
  2. func()调用将在记住身体应该使用if (setjmp(jmp_ret) == 0)返回的位置之后,使用if (setjmp(jmp_ret) == 0)临时跳转到身体。
  3. 主体将使用func()执行并跳转回longjmp(jmp_ret, 1)调用。
  4. func()将像预期的那样返回到main()

因此,我期望代码打印如下:

代码语言:javascript
复制
Body 1
Body 2
Body 3

相反,它会永远地循环不断地执行主体,这意味着func()调用没有返回它应该返回的地方,而是可能在自身之上返回,一次又一次地执行自己。

相比之下,下面的代码打印的正是我所期望的:

代码语言:javascript
复制
#include <stdio.h>
#include <setjmp.h>
jmp_buf jmp_body, jmp_ret;

int main()
{
    int x = 0;
    if (setjmp(jmp_body) == 1) {
        printf("Body %d\n", ++x);
        longjmp(jmp_ret, 1);
    }
    if (setjmp(jmp_ret) == 0)
        longjmp(jmp_body, 1);
    if (setjmp(jmp_ret) == 0)
        longjmp(jmp_body, 1);
    if (setjmp(jmp_ret) == 0)
        longjmp(jmp_body, 1);
    return 0;
}

如何将if (setjmp(jmp_ret) == 0) longjmp(jmp_body, 1)放入函数调用中,从而使原始方法无效?

EN

回答 1

Stack Overflow用户

发布于 2021-07-15 14:15:04

您尝试将longjmpmain()还原到func()。这是没有定义的。因为longjmp本身就是一个函数,所以您很可能以longjmp进入func,返回地址是longjmp调用本身,因此是一个无限循环。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68395378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档