gpt4 book ai didi

c - 两个独立的 jmp_bufs 如何工作?

转载 作者:太空宇宙 更新时间:2023-11-04 08:47:44 25 4
gpt4 key购买 nike

您好,我想问一下 setjmp/longjmp。我试图搜索,但我没有成功......

#include <stdio.h>
#include <setjmp.h>

jmp_buf a, b;

void jump() {
int aa = setjmp(a);

if (aa)
{
printf("Jump!\n");
}
else
{
longjmp(b, 1);
printf("Should not happened...\n");
}

printf("End of function!\n");
}


int main(int argc, char** argv) {
int bb = setjmp(b);

if (bb)
{
longjmp(a, 1);
printf("Should not happened...\n");
}
else
{
jump();
printf("What here?\n");
}

printf("Exit\n");
return 0;
}

问题是,在 jump() 中最后一个 printf 之后会发生什么...我试过这段代码,它变成了无限循环。为什么?我虽然 setjmp 会存储环境数据,所以跳转函数应该在它的原始调用后返回......我很困惑。谢谢回复:)

最佳答案

整个程序有未定义的行为。

  1. setjmp(b); 存储堆栈状态。
  2. jump() 被调用。
  3. `setjmp(a);'再次存储堆栈状态。
  4. longjmp(b, 1); 将堆栈恢复到调用 jump() 之前的点。所以存储在 a 中的状态现在是无效的。
  5. main() 中的 if 处继续执行。
  6. longjmp(a, 1); 被调用。哎哟。由于上面的 4,这会导致未定义的行为。

您的困惑可能是由于 setjmp() 的 Linux 文档中对世界“return”的稍微不精确的使用造成的。

The stack context will be invalidated if the function which called setjmp() returns.

在您的示例中,函数 jump() 没有以正常方式返回,但效果是一样的:堆栈被第一个 longjmp() “切碎” jump() 之前的状态,这也是 return 所做的。

关于c - 两个独立的 jmp_bufs 如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20978959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com