C语言趣味测试题:setjmp与longjmp深入解析

2 下载量 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语言开发者来说是非常实用和重要的练习。