【问题标题】:Creating a loop using setJmp longJmp使用 setJmp longJmp 创建循环
【发布时间】:2021-10-10 13:11:34
【问题描述】:

我正在尝试使用这些函数创建一个无限循环(不成功)。

我的代码:

jmp_buf buf1;

void foo(){
    int z = 4, y = 1;
    int v = setjmp(buf1);
    if(v == 0){
     printf("A%d", z);
     longJmp(buf1, 1);
    }
    else if(v == 1){
        printf("B%d", y);
        longjmp(buf1,1);
    }
}

int main(){
    int v = setjmp(buf1);
    if( v == 0){
        printf("C%d", 1);
        foo();
        longjump(buf1,1);
    }
}

我以为它会打印 C1A4B1B1B1....(B1 永远重复)但我只得到 C1A4B1 并且程序停止(分段错误)。 调用longJmp不总是返回带参数val的setJmp吗?

想知道我的错误在哪里。

编辑:我在得到答案之前复制的代码错误地不正确,longjmp(buf1,2) 而不是 longjmp(buf1,1)。 此外,我没有复制导致段错误的完整主代码。 (调用 foo 后的另一个 longjmp)

【问题讨论】:

  • 我建议您学习如何使用调试器以及如何使用它来设置断点。在每个setjmp 调用上设置一个断点,并查看它每次返回时返回的值。
  • 另外请创建一个正确的minimal reproducible example,它会实际构建(即使添加头文件后显示的代码也不会构建)。然后将其复制粘贴到您的问题中。

标签: c linux setjmp


【解决方案1】:

在第 15 行之后,longjmp(buf1,2);
v 是 2。

下次重复时,v不为1,函数结束。

longjmp(buf1,2); > longjmp(buf1,1);

【讨论】:

  • 问题中显示的代码中没有longjmp(buf1,2)。第 15 行是 main 函数之前的空行(除非我的计数关闭)。
  • @Someprogrammerdude 我错误地复制了错误的代码,下次提问前一定要多加注意。非常抱歉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多