C语言趣味测试题:setjmp与longjmp深入解析
180 浏览量
更新于2024-09-01
收藏 126KB PDF 举报
本文档提供了一套经典的C语言趣味编程题目,旨在检验和提升C语言开发人员的基础技能。首先,我们来看第一题:
**第一题:setjmp与longjmp的运用**
```c
#include <setjmp.h>
static jmp_buf buf;
int main(void){
volatile int b = 3;
if (setjmp(buf) != 0) { // 当程序遇到longjmp时,跳回到这里
printf("%d\n", b); // 输出3
exit(0);
}
b = 5;
longjmp(buf, 1); // 强制执行到这里,模拟异常或保存状态
}
```
关键知识点在于`setjmp`和`longjmp`函数的配合。`setjmp`用于保存当前程序的状态,当遇到`longjmp`时,程序会跳回`setjmp`指定的位置,但只有当`longjmp`的第一个参数为0时,`setjmp`才会返回非0值。因此,这里的输出是5,因为`b`的值在`longjmp`后被改变。
这个例子展示了`setjmp-longjmp`组合用于控制流程,类似于异常处理机制,允许程序在特定条件下跳过正常执行流程。
**第二题:结构体指针与类型转换**
```c
struct node {
int a;
int b;
int c;
};
struct node s = {3, 5, 6};
struct node *pt = &s;
printf("%d\n", *(int*)pt); // 输出3,通过指针pt访问结构体成员a
修改后的题目:
struct node {
char a;
char b;
short c;
int d;
};
struct node s = {3, 5, 6, 99};
struct node *pt = &s;
printf("%X\n", *(int*)pt); // 输出结构体成员a的地址,注意32位编译器中int类型的大小
```
在这里,`printf`通过将`pt`转换为`int`指针并解引用,打印出`a`的值。当结构体成员类型不同,如char、short和int,编译器会根据数据类型和目标机器的字节对齐规则来存储,因此输出的是`a`的地址(通常以十六进制表示)。
这两道题目不仅考察了基础语法和类型转换,还涉及了指针的深入理解和内存布局的理解。这对于C语言开发者来说是非常实用和重要的练习。
545 浏览量
114 浏览量
2022-06-14 上传
186 浏览量
2022-06-14 上传
2022-03-25 上传
weixin_38577200
- 粉丝: 9
- 资源: 907
最新资源
- 设置Windows 10 1903/1909/2004的脚本-.NET开发
- 一个TCP和UPD聊天、传收文件程序
- Homework-QUestion
- MTK10.0竖屏壁纸居中补丁.zip
- xiubox
- 键盘测试工具,机械键盘换轴后检测用
- echidna:W3C的新发布工作流程-主要组件
- Vue Devtools
- SoapUI(附安装步骤).rar
- pid控制器代码matlab-CDC18a:A.Selivanov和E.Fridman,“PID控制器的鲁棒采样数据实现”,在第57届IEEE
- animeWiki
- mcjoin:简单的多播测试应用程序
- abc:aa
- Asc2Silo file converter-开源
- 行业文档-设计装置-一种拱桥施工平台结构.zip
- BE2Works_v4.52_Bohol_fu11.7z