gpt4 book ai didi

c - 为什么 setjmp/longjmp 在 MSVC 上崩溃,而在 MinGW 中却没有?

转载 作者:太空狗 更新时间:2023-10-29 14:53:33 56 4
gpt4 key购买 nike

我想用setjmp()/longjmp()来实现协程系统。然后我决定编写一个小的 .c 文件来测试它。在 MinGW 中,没关系;我得到了我想要的结果。但是当我在 MSVC++ 中编译它时,程序崩溃:“访问冲突”

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

jmp_buf a;
int is_invoke=0;

void
action_1()
{
for ( ;; ) {
printf("hello~~~A\n");
if(!setjmp(a)) {
is_invoke=1;
return;
}
}
}

void
func()
{
if (is_invoke) {
longjmp(a,1);
}
action_1();
printf("end\n");
}

void
dummy()
{
;
}

int
main(int argc, char *argv[])
{
for ( ;; ) {
func();
dummy();
}
return 0;
}

最佳答案

setjmp 的手册页说:

setjmp() saves the stack context/environment in env for later use by longjmp(). The stack context will be invalidated if the function which called setjmp() returns.

在一个简单的实现中,您可能假设 jmp_buf 包含一个用于重置堆栈指针的地址和一个用于跳转的地址。一旦您从保存 jmp_buf 的函数返回,jmp_buf 指向的堆栈帧就不再有效,可能会立即损坏。

或者换句话说,您只能依靠 longjmp 充当一种 super return 语句——永远不会更深入。

我认为这对您在 mingw 中有效(对我在 Linux 中有效)的原因是特定于实现的,并且可能取决于运气。还有另一种方式——你读过Simon Tatham's evil coroutine macros吗?作文?

关于c - 为什么 setjmp/longjmp 在 MSVC 上崩溃,而在 MinGW 中却没有?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8628067/

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