吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1048|回复: 3
收起左侧

[已解决] c语言setjmp和longjmp怎么使用?

[复制链接]
red豆 发表于 2020-2-19 17:31
本帖最后由 red豆 于 2020-2-20 11:26 编辑

我是刚入门的菜鸟,想问一下c语言中setjmp 和 longjmp怎么使用?
看了很多教程,还是不明白。
为了方便大家解释,我写了一段代码
[C] 纯文本查看 复制代码
#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 编辑

作为一个小白第一次听说这俩函数,经测试如下结果
01.jpg
代码如下
[C] 纯文本查看 复制代码
#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 编辑

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

[C] 纯文本查看 复制代码
#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热心值 +1 收起 理由
red豆 + 1 谢谢@Thanks!

查看全部评分

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-14 02:30

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表