red豆 发表于 2020-2-19 17:31

c语言setjmp和longjmp怎么使用?

本帖最后由 red豆 于 2020-2-20 11:26 编辑

我是刚入门的菜鸟,想问一下c语言中setjmp 和 longjmp怎么使用?
看了很多教程,还是不明白。
为了方便大家解释,我写了一段代码
#define _CRT_SECURE_NO_WARNINGS//scanf
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>

float a(void);
int main()
{
      printf("请输入");
      int ab;
      scanf("%d", &ab);
      if (ab == 0)
      {
                //就跳转到下面hehehe处
      }
      else
      printf("输入合法");
      system("pause");
      return 0;
}
float a(void)
{
hehehe:
      printf("输入不合法");
      return 0.0f;
}
向大家求助

我的爱是你 发表于 2020-2-19 23:19

本帖最后由 我的爱是你 于 2020-2-19 23:21 编辑

作为一个小白第一次听说这俩函数,经测试如下结果

代码如下
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>

void a(void);

jmp_buf buf;

int main()
{
      printf("请输入");
      int ab;
      scanf_s("%d", &ab);

      a();    //注意要跳转函数必须要执行一次使其保存在堆栈中

      if (ab == 0)
      {
                longjmp(buf,1);   //这里已经跳过去了
      }
      else
                printf("输入合法");
      system("pause");
      return 0;
}
void a()
{
      if (setjmp(buf))
      {
                printf("输入不合法");   //输出成功,我们跳到这里了
      }
}
其虽然输出成功但函数退出时会崩溃,经思考此为堆栈原因可能此函数保存在堆栈中出了什么问题 ,也可能此跳转函数我使用犯了个小错误。

red豆 发表于 2020-2-20 08:27

我的爱是你 发表于 2020-2-19 23:19
作为一个小白第一次听说这俩函数,经测试如下结果

代码如下


感谢回答
我昨天试的时候没有加那句a();
输入0后报错0x031CCCE0 处有未经处理的异常(在 goto和函数.exe 中): 0x80000026: 一个长跳转已经运行。。
今天加上了,输出两个“输入不合法”??然后和你一样的错误
编译器vs2017

我的爱是你 发表于 2020-2-20 10:52

本帖最后由 我的爱是你 于 2020-2-20 10:54 编辑

昨天回完你就睡觉了,所以没有调试此错误。
其实很简单,此跳转不过跳到堆栈某位置后顺序执行程序而已 ,其自然只能从子函数跳主函数 ,要不跳子函数执行完子函数自然会报错。
这个问题调试一下就可以!


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

void a(void);

jmp_buf buf;

int main()
{
      if (setjmp(buf))
      {
                puts("输入错误!!");
                return -1;
      }

      a();

      system("pause");
      return 0;
}

void a()
{
      printf("请输入");
      int ab;
      scanf_s("%d", &ab);

      if (ab == 0)
      {
                longjmp(buf, 1);   //这里已经跳过去了
      }
      else
                printf("输入合法");
}
页: [1]
查看完整版本: c语言setjmp和longjmp怎么使用?