西邮 Linux 兴趣小组 2026 纳新面试题

西邮 Linux 兴趣小组 2026 纳新面试题

0. 树懒闪电的二进制车牌

树懒闪电要办一张二进制车牌:16 个按钮里有四个连续按钮的数是 21、34、55、89,每个按钮最多按一次、不能按相邻的两个,按下数字之和即车牌号。

屏幕显示 11010100101,该按哪几个按钮?其十进制是多少?

提示: 这 16 个数构成递推数列,每项等于前两项之和。

解析:

  1. 这十六个数构成的是斐波那契数列,已经知道了四个连续的数,那么就可以算出来其它的数来。
  2. 二进制数转十进制数的方法是,从右往左,每一位的数字乘以2的对应位次次方(位次从 0 开始计数),再将所有结果相加。数字之和的二进制表示给了出来,则其十进制数可以求出来。
  3. 根据总和算按下的按钮。

答案
按下的按钮为:2 13 89 1597


1. 一句印不完的欢迎词

这句欢迎词是永无止境的吗?请解释运行结果:printf 的返回值扮演了什么角色,while 是否真的停不下来?

intmain(){while(1){printf("Hi! ");if(!printf("The 202%d, Welcome to Xiyou Linux Group!\n",printf("guys! "))){break;}}}

解析

  1. printf是有返回值的,返回值是其成功打印的字符个数,包括空格,标点等。
  2. !是 C 语言里的逻辑非运算符,可以直接理解成:不、反过来、取反。
  3. 若值是0,为假,if循环语句不执行,即不执行break。如果值为非0,为真,if循环语句执行,即执行break。
  4. 执行了break,while才能停止。

答案
死循环,无限输出Hi! guys! The 2026, Welcome to Xiyou Linux Group!


2. 失忆的交换生

两位交换生都帮 a 和 b 换座位:第一位换完就忘,第二位却成功了。请解释运行结果:函数修改外部变量的必要条件是什么?

voidswap_val(intx,inty){inttmp=x;x=y;y=tmp;}voidswap_ptr(int*x,int*y){inttmp=*x;*x=*y;*y=tmp;}intmain(){inta=10,b=20;swap_val(a,b);printf("swap_val: a=%d, b=%d\n",a,b);swap_ptr(&a,&b);printf("swap_ptr: a=%d, b=%d\n",a,b);}

解析

  • 函数传参其实就是在内存上重新申请了一块空间来储存所传的数据。因此,新空间上数据的改变无法让原空间上的数据改变,这是两组不同的数据。
  • 只有获取了原数据的地址,外部函数才能更改原数据。即传址调用。

答案
swap_val: a=10, b=20
swap_ptr: a=20, b=10


3. sizeof 的视力表

请预测输出,并解释每个 sizeof 和 strlen 的结果:注意字符串中间的 \0、数组退化与指针类型。

voidinspect(chartext[],int(*matrix)[4]){printf("%zu %zu %zu %zu\n",sizeof(text),sizeof(matrix),sizeof(*matrix),strlen(text));}intmain(){chara[]="Linux\0Group";char*p=a;intb[2][4]={{1,2,3,4},{5,6,7,8}};printf("%zu %zu %zu\n",sizeof(a),sizeof(p),sizeof(a+0));printf("%d %d\n",a[5]=='\0',strcmp(a,"Linux"));inspect(a,b);}

解析:

  1. 数组作为函数参数会退化为指针。
  2. 数组名参与运算会变成指针。
  3. sizeof(数组名)或&(数组名)时,数组名代表整个数组,否则是数组首元素的地址。
  4. 64 位下指针大小都是 8 字节。

答案

sizeof(a)=12sizeof(p)=8sizeof(a+0)=800inspect中:sizeof(text)=8sizeof(matrix)=8sizeof(*matrix)=16strlen(text)=5

4. XOR 密钥:藏在字节里的悄悄话

一串数字里藏着一句悄悄话。请解释代码如何用位运算把数字还原成字符:mask 怎么构造,为什么异或后恰好是原文?

intmain(){intnums[]={167,150,134,144,138,179,150,145,138,135,184,141,144,138,143};intsize=sizeof(nums)/sizeof(nums[0]);for(inti=0;i<size;i++){intmask=0;intbitval=1;intbits=8;while(bits-->0){mask|=bitval;bitval<<=1;}printf("%c",nums[i]^mask);if(i==size-1){printf("\n");}}}

解析
1.位运算符:

  • & 按位与:对应两个二进制位,只有两位都是 1,结果位才是 1;只要有一个是 0,结果就是 0。
  • | 按位或:对应两个二进制位,只要有一个是 1,结果位就是 1;两位全 0 才是 0。
  • ^ 按位异或:对应两个二进制位,不一样(一个 0 一个 1)结果就是 1;一样(全 0 或全 1)结果就是 0。
  1. while (bits-- > 0) { mask |= bitval; bitval <<= 1;
    的作用是:将mask的每一位都变成1
  2. 将数组中的元素与改变后的mask按位异或,相当于将各个元素按位取反,达到解密的效果。

答案
XiyouLinuxGroup


5. 宏召唤术:括号去哪儿了

这两个宏看着人畜无害,展开后却各有脾气。请写出四行 printf 的输出,并解释原因。

#defineSQUARE(x)x*x#defineMAX(a,b)((a)>(b)?(a):(b))intmain(){inti=3;printf("%d\n",SQUARE(i+1));printf("%d\n",MAX(i,5));printf("%d\n",MAX(i++,5));printf("%d\n",i);}

解析

  • 宏定义是纯文本替换,不会自动加括号,不考虑运算优先级

答案
7
5
5
4


6. p 与 q 的步幅之争

p 和 q 指向同一个数组,“步幅”却大不相同。输出是什么?p + 1 和 q + 1 各跨过多少字节?

intmain(){inta[4]={1,2,3,4};int*p=a;int(*q)[4]=&a;printf("%td %td\n",(char*)(p+1)-(char*)p,(char*)(q+1)-(char*)q);printf("%d %d\n",*(p+2),*(*q+2));}

解析

  1. 当&(数组名)或sizeof(数组名)时,数组名代表的是整个数组,否则,数组名就是数组首元素的地址。
  2. short 占2个字节; int 类型占四个字节;char 占一个字节;long 占6个字节;long long 占8个字节;
  3. 指针 + 1,移动的字节数 = 指向类型的大小。

答案
4 16
3 3


7. 记性特别好的 x

这个 x 走遍千山万水仍记得来时的路。请预测每行输出,并解释 static 局部变量在递归中的行为。

intvisit(intn){staticintx=0;if(n==0)returnx;x+=n;printf("before %d %d\n",n,x);intresult=visit(--n);printf("after %d %d %d\n",n,x,result);returnx+result;}intmain(){printf("first = %d\n",visit(3));printf("second = %d\n",visit(2));}

解析

  1. static的作用:
  • 作用于局部变量
    使该局部变量的生命周期变长,可以从程序开始存在于程序结束。但该局部变量的作用域未变。
  • 作用于全局变量
    使该全局变量只能在本文件中起作用,其他文件无法调用。
  • 作用于函数
    使其作用域限制在本文件中
  1. 递归的过程:
    主函数
    ↓调用 visit(3)
    ┌───────────────────────────────┐
    │ visit(3) │ x = 0+3 = 3,打印 before 3 3
    │ return x + result → 6+18=24 │←──┐ 拿到下层返回的result=18,算出24,返回给主函数
    └───────────────────────────────┘ │
    ↓调用 visit(2) │
    ┌───────────────────────────────┐ │
    │ visit(2) │ │ x = 3+2 = 5,打印 before 2 5
    │ return x + result → 6+12=18 │←──┐ 拿到下层返回的result=12,算出18,返回给上一层
    └───────────────────────────────┘ │
    ↓调用 visit(1) │
    ┌───────────────────────────────┐ │
    │ visit(1) │ │ x = 5+1 = 6,打印 before 1 6
    │ return x + result → 6+6=12 │←──┐ 拿到下层返回的result=6,算出12,返回给上一层
    └───────────────────────────────┘ │
    ↓调用 visit(0) │
    ┌───────────────────────────────┐ │
    │ visit(0) │ │
    │ return x → 6 │───┘ 触发终止条件,直接返回当前的 x=6
    └───────────────────────────────┘

    答案
    before 3 3
    before 2 5
    before 1 6
    after 0 6 6
    after 1 6 12
    after 2 6 18
    first = 24
    before 2 8
    before 1 9
    after 0 9 9
    after 1 9 18
    second = 27


8. 谁能动 const 大神的奶酪

一眼以为“const 就全不能动”,逐条判断却错一片。请判断九个操作是否合法,并说明原因。

structP{intx;constinty;};intmain(){structPp1={11,22},p2={33,44};conststructPp3={55,66};structP*constptr1=&p1;conststructP*ptr2=&p2;conststructP*constptr3=&p3;ptr1->x=111;ptr2->x=333;ptr3->x=555;ptr1->y=222;ptr1=&p2;ptr2->y=444;ptr2=&p1;ptr3->y=666;ptr3=&p1;}

解析
const的作用:

  • 修饰变量后,此变量不可更改。
  • 修饰指针: const在 * 左边,指针指向的内容不能更改;const在 * 的右边,指针不能改。const在 * 中间,什么都不能改。
  • 修饰函数,函数内部不会修改传入的数据。

答案

操作是否合法原因
ptr1->x = 11合法ptr1 是普通指针,指向普通结构体,x 是非 const 成员
ptr2->x = 333非法ptr2 指向 const 结构体,不能通过它修改任何成员
ptr3->x = 555非法ptr3 指向 const 结构体,不能修改成员
ptr1->y = 222非法y 本身就是结构体里的 const 成员,任何方式都不能改
ptr2 = &p1合法ptr2 本身不是 const 指针,可以改指向;指向常量的指针可以指向非 const 变量
ptr2->y = 444非法y 本身是 const,且 ptr2 指向 const 结构体
ptr3 = &p1非法ptr3 是常量指针,指针本身不能修改指向
ptr3->y = 666非法指向 const 结构体,且 y 本身是 const
*ptr3.x = ...非法双重 const 限制,既不能改指向也不能改指向的内容

9. 当函数变成了数字

在这里,函数既能装进数组,也能被加减乘除。这段代码写得标准吗?注意 INT_MIN 和 0xFFFFFFFF。

typedefint(*BinOp)(int,int);intadd(inta,intb){returna+b;}intsub(inta,intb){returna-b;}intmul(inta,intb){returna*b;}BinOp ops[3]={add,sub,mul};int(*get_op(charc))(int,int){switch(c){case'+':returnadd;case'-':returnsub;default:returnmul;}}intmain(){printf("%d\n",get_op('*')(7,-2));printf("%d\n",ops[1](INT_MIN,20));printf("%d\n",get_op('+')(0xFFFFFFFF,2027));}

解析:

  1. 0XFFFFFFFF作为 32 位有符号 int,补码表示的是-1
  2. INT_MIN - 2:有符号整数溢出,结果是2^31-20。

答案
5
2147483646
2826


10. 字节战队排排站:大端、小端与内存对齐

同一片内存,不同视角看到不同世界。请写出全部输出,并解释大端、小端与内存对齐的原理

structdata_box{intnum;union{unsignedintu32_val;unsignedcharbytes[4];charstring[32];}un;shorttag;longlongmagic;intbuf[4];};intmain(){intarr[]={0x00000000,0x6F796958,0x694C2075,0x2078756E,0x756F7247,0x00000070,0x44556677,0x8899aabb};printf("%s\n",((structdata_box*)arr)->un.string);printf("byte0 = 0x%02X\n",((structdata_box*)arr)->un.bytes[0]);printf("byte1 = 0x%02X\n",((structdata_box*)arr)->un.bytes[1]);printf("byte2 = 0x%02X\n",((structdata_box*)arr)->un.bytes[2]);printf("byte3 = 0x%02X\n",((structdata_box*)arr)->un.bytes[3]);}

答案

Xiyou Linux Group byte0=0x58byte1=0x69byte2=0x79byte3=0x6F
  • 小端模式:数据的低字节存在内存低地址,高字节存在高地址。
  • 大端模式:高字节存在低地址。
  • 共用体:所有成员共享同一块内存,大小等于最大成员的大小。
  • 内存对齐:结构体成员按自身大小对齐内存,整体大小是最大对齐数的整数倍。

相关新闻

OpenClaw自动化实战:10个高频场景与避坑指南

OpenClaw自动化实战:10个高频场景与避坑指南

1. 从"手动重复"到"一句话搞定"&#xff1a;OpenClaw 到底改变了什么第一次接触 OpenClaw 是在一个自动化需求特别密集的项目里。当时团队每天要处理大量重复性的操作——批量整理文件、定时抓取数据、跨工具同步信息、自动生成日报。这些活儿单看都不难&a…

2026/10/20 5:16:02 阅读更多 →
智能化自研是智能电动车企的护城河:从数据闭环到量产落地

智能化自研是智能电动车企的护城河:从数据闭环到量产落地

智能化技术自研这件事&#xff0c;我入行这几年看得越来越清楚&#xff1a;它不只是技术路线选择&#xff0c;更是一家智能电动车企业能不能把护城河挖深的生死题。最近和同行聊起新势力的核心竞争力&#xff0c;大家绕不开一个判断——谁把智能化自研做透&#xff0c;谁才有资…

2026/10/20 5:16:02 阅读更多 →
Transformer实战指南:从自注意力原理到NLP项目落地经验

Transformer实战指南:从自注意力原理到NLP项目落地经验

做NLP项目这些年&#xff0c;我绕不开一个话题——Transformer。从文本分类到序列标注&#xff0c;从短文本到长文档&#xff0c;架构选择的天平几乎都指向它。这篇东西算是我从RNN时代一路用过来的记录&#xff0c;会聊清楚为什么Transformer能成为NLP领域的事实标准&#xff…

2026/10/20 5:16:02 阅读更多 →

最新新闻

图表设计方法论:从需求到成图的完整链路与实操技巧

图表设计方法论:从需求到成图的完整链路与实操技巧

1. 从"diagram-design"这个标题里能读出什么第一次看到"diagram-design"这个标题&#xff0c;我脑子里蹦出来的第一个判断是&#xff1a;这大概率不是一个单纯的"画图工具推荐"&#xff0c;而是一套关于图表设计方法论的沉淀。为什么这么说&…

2026/10/20 5:58:21 阅读更多 →
9.7K Star开源AI数字人宣传片生成器:本地部署零成本搞定口播视频

9.7K Star开源AI数字人宣传片生成器:本地部署零成本搞定口播视频

产品宣传片这件事&#xff0c;过去基本是预算和时间的双重考验。外请团队拍一条&#xff0c;少则几千多则几万&#xff0c;还得排期、对脚本、现场补拍。最近我在开源社区看到一个 9.7K Star 的项目&#xff0c;思路很有意思&#xff1a;它把 AI 文案、语音生成、数字人驱动、字…

2026/10/20 5:58:21 阅读更多 →
MCP传输选型:stdio与Streamable HTTP路径解析与流式消息指南

MCP传输选型:stdio与Streamable HTTP路径解析与流式消息指南

1. 先把两条“路”的底细摸清楚最近在对接MCP服务的时候&#xff0c;经常有人拿着同样一个问题来找我&#xff1a;MCP的stdio和Streamable HTTP到底怎么选&#xff0c;折腾半天标了“流式消息”的东西最后又传到哪里去了&#xff1f;说实话&#xff0c;这两个问题看着基础&…

2026/10/20 5:58:21 阅读更多 →
DE到L-SHADE的Matlab实现与CEC2005基准对比全流程解析

DE到L-SHADE的Matlab实现与CEC2005基准对比全流程解析

做进化算法对比实验&#xff0c;最折腾人的其实不是算法本身写不出来&#xff0c;而是你拿着三个算法的实验结果&#xff0c;说不清楚差异到底来自改进策略还是来自实现细节。去年我在做智能优化方向的横向对比时&#xff0c;需要把经典差分进化算法&#xff08;DE&#xff09;…

2026/10/20 5:58:21 阅读更多 →
LoRA微调Qwen2.5实现仿真机械臂视觉抓取控制实战

LoRA微调Qwen2.5实现仿真机械臂视觉抓取控制实战

1. 项目概述与需求拆解1.1 核心需求解析机械臂控制历来是机器人领域的硬骨头&#xff0c;传统方案要么依赖精确的运动学建模&#xff0c;要么需要耗费大量人力编写规则逻辑。我这次做的项目&#xff0c;方向是用大语言模型直接“看懂”视觉画面&#xff0c;再输出机械臂的控制指…

2026/10/20 5:58:21 阅读更多 →
Wireshark无线安全分析实战:WEP/WPA/WPA2加密流量特征全解析

Wireshark无线安全分析实战:WEP/WPA/WPA2加密流量特征全解析

一条条看下去&#xff0c;标题列的“无线安全分析实战”正是这两年我这边做得比较多的活儿。很多朋友拿到Wireshark就只会看个HTTP请求&#xff0c;最多过滤个TCP三次握手&#xff0c;遇到Wi-Fi抓包经常是一脸懵&#xff1a;明明同一个路由器&#xff0c;手机连着和电脑连着抓出…

2026/10/20 5:57:21 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →