西邮 Linux 兴趣小组 2025 纳新面试题0. 拼命的企鹅一只企鹅在爬山每隔一段路都会遇到一块石头。第 1 块石头重量是 a每往上走一段路石头重量就会变成上一段的平方。企鹅可以选择把某些石头捡起来最后把捡到的石头重量相乘。它怎样捡石头才能得到重量乘积恰好是 a 的 b 次方的石头比如 b 173 时 要捡哪些石头解析每块石头的指数都是2 的整数次幂石头重量乘积恰好是 a 的 b 次方相当于选出若干个不同的 2 的幂让它们相加正好等于 b有了以上两条分析的基础我们可以发现这就是二进制转成十进制的过程答案将b转成二进制二进制从右往左数从 0 开始数第 i 位是 1就选第 i1 块石头1. 西邮Linux欢迎你啊请解释以下代码的运行结果。intmain(){if(printf(Hi guys! )||printf(Xiyou Linux )){printf(%d\n,printf(Welcome to Xiyou Linux 2%d,printf()));}return0;}解析||存在短路现象当第一个判断条件成立后后面的判断语句就不会执行。printf存在返回值返回值是其成功打印的字符个数。代码按序执行。答案Hi guys!Welcome to Xiyou Linux20252. 可以和 \0 组一辈子字符串吗你能找到成功打印的语句吗你能看出每个 if 中函数的返回值吗这些函数各有什么特点intmain(){charp1[]{W,e,l,c,o,m,e,\0};charp2[]Join us\0,p4[]xiyou_linux_group;constchar*p3Xiyou Linux Group\0\n2025\0;if(strcmp(p1,p2)){printf(%s to %s!\n,p1,p2);}if(strlen(p3)sizeof(p3)){printf(%s,p3);}if(sizeof(p1)sizeof(p2)){printf(%s,p4);}return0;}解析strcmp是字符串比较函数遇到\0停止比较。若字符串相同返回 0 。if的判断中0 为假非 0 为真。sizeof(p1)中算的是指针自身的大小。答案Welcome to Join us!Xiyou Linux Group3. 数学没问题浮点数有鬼这个程序的输出是什么解释为什么会这样intmain(){floata10.3,b16e-1,sum10.9;printf(a1 b1 %s sum1\n,(a1b1sum1)?:!);floata20x0.3p0,b20x6p-4,sum20x0.9p0;printf(a2 b2 %s sum2\n,(a2b2sum2)?:!);return0;}解析e^-n是科学计数法表示10^-n。十进制浮点数无法精确转成二进制只能转成一个近似的值。十六进制可以精确转成二进制。比较浮点数是否相等应该将两个数的差值与一个非常小的值进行比较。答案a1b1!sum1 a2b2sum24. 不合群的数字在一个数组中所有数字都出现了偶数次只有两个数字出现了奇数次请聪明的你帮我看看以下的代码是如何找到这两个数字的呢voidfindUndercoverIDs(intnums[],intsize){intxorAll0,id_a0,id_b0;for(inti0;isize;i){xorAll^nums[i];}intdiffBitxorAll-xorAll;for(inti0;isize;i){if(nums[i]diffBit){id_a^nums[i];}else{id_b^nums[i];}}printf(These nums are %d %d\n,id_a,id_b);}解析相同的数异或结果为 0任何数和 0 异或结果等于自己满足交换律、结合律异或的顺序不影响最终结果第一个for循环后xorAll等于两个出现奇数次的数异或后的值第二个for循环通过两个数的差异位将这两个数装进不同的组中答案These nums are355. 会一直循环吗你了解 argc 和 argv 吗程序的输出是什么为什么会这样intmain(intargc,char*argv[]){printf(argc %d\n,argc);while(argc0){if(argc0){printf(argv[0] %s\n,argv[0]);break;}}printf(argc %d\n,argc);return0;}解析argc是程序中参数的个数argv储存的是程序中的参数名整数溢出后数据会变成最小值执行break后循环结束答案argc1argv[0]程序名 argc-21474836486. const 与指针谁能动谁不能动structP{intx;constinty;};intmain(){structPp1{10,20},p2{30,40};conststructPp3{50,60};structP*constptr1p1;conststructP*ptr2p2;conststructP*constptr3p3;return0;}说说下列操作是否合法并解释原因ptr1-x 100, ptr2-x 300, ptr3-x 500ptr1-y 200, ptr1 p2, ptr2-y 400ptr2 p1, ptr3-y 600, ptr3 p1解析const在 * 的左边指针指向的内容不能修改const在 * 的右边指针不能修改。答案操作是否合法ptr1-x 100合法ptr2-x 300非法ptr3-x 500非法ptr1-y 200非法ptr1 p2非法ptr2-y 400非法ptr2 p1合法ptr3-y 600非法ptr3 p1非法7. 指针数组!在主函数中定义如下变量:intmain(){inta[3]{2,4,8};int(*b)[3]a;int*c[3]{a,a1,a2};int(*f1(int))(int*,int);return0;}说说这几个表达式的输出分别是什么a, *b, *b 1, b, b 1, * (*b 1), c, sizeof(a), sizeof(b), sizeof(a), sizeof(f1)解析int (*b)[3]是数组指针int* c[3]是指针数组int (*f1(int))(int*, int);是一个函数申明。它可以看成这样int (*)(int*,int) f1(int);这是一个函数它的名字是 f1 参数是 int 类型返回值是一个函数指针。这个函数指针指向的函数函数参数是int*,int,返回值是int答案表达式结果 / 含义a数组首元素地址*b数组首元素地址*b 1a[1]的地址b数组首地址b 1跳过整个数组后的地址*(*b 1)值为 4c指针数组首元素地址sizeof(a)12 字节sizeof(b)4 字节sizeof(a)4 字节sizeof(f1)4 字节8. 全局还是局部观察程序输出思考为什么intg;intfunc(){staticintj98;jg;returnj;}intmain(){g3;chararr[6]{};arr[1]func();arr[0]func();arr[2]arr[3]func()1;arr[4]func()1;printf(%s linux\n,arr);return0;}解析1.C语言规定 局部变量不初始化是随机值全局变量默认是 02. static 局部变量后局部变量变成全局变量3. 将数值赋值给字符数组数值会根据ASCII值变成对应的字符答案hello linux9. 宏函数指针观察程序结果说说程序运行的过程#defineCALL_MAIN(main,x)(*(int(*)(int))*main)(x);#defineDOUBLE(x)2*xint(*registry[1])(int);intmain(intargc){if(argc2e3)return0;printf(%d ,argc1);*registry(int(*)(int))main;CALL_MAIN(registry,DOUBLE(argc1));return0;}解析int (*registry[1])(int);是函数指针数组的申明。argc是程序中变量的个数。*registry 是函数指针数组的首元素。*registry (int(*)(int))main是将 main 函数地址强制转换为函数指针,并将这个指针赋给函数指针数组的首元素。#define CALL_MAIN(main, x) (*(int (*)(int))*main)(x);的作用把传入的第一个参数先解引用取出函数指针强制转换为参数为 int、返回值为 int 的函数指针然后调用该函数传入参数x。不断递归调用 main 函数当满足argc 2e3后,递归停止。答案2 4 8 16 32 64 128 256 512 102410. 拼接 排序 去重本题要求你编写以下函数不能改动 main 函数里的代码。实现对 arr1 和 arr2 的拼接、排序和去重。你需要自行定义 result 结构体并使用 malloc 手动开辟内存。intmain(){intarr1[]{6,1,2,1,9,1,3,2,6,2};intarr2[]{4,2,2,1,6,2};intlen1sizeof(arr1)/sizeof(arr1[0]);intlen2sizeof(arr2)/sizeof(arr2[0]);structresultresult;your_concat(arr1,len1,arr2,len2,result);print_result(result);your_sort(result);print_result(result);your_dedup(result);print_result(result);free(result.arr);return0;}答案#includestdio.h#includestdlib.hstructresult{int*arr;intlen;};voidyour_concat(intarr1[],intlen1,intarr2[],intlen2,structresult*res){inttotallen1len2;res-arr(int*)malloc(total*sizeof(int));res-lentotal;inti;for(i0;ilen1;i){res-arr[i]arr1[i];}for(i0;ilen2;i){res-arr[len1i]arr2[i];}}voidprint_result(structresultres){inti;for(i0;ires.len;i){printf(%d ,res.arr[i]);}printf(\n);}voidyour_sort(structresult*res){inti,j,temp;for(i0;ires-len-1;i){for(j0;jres-len-1-i;j){if(res-arr[j]res-arr[j1]){tempres-arr[j];res-arr[j]res-arr[j1];res-arr[j1]temp;}}}}voidyour_dedup(structresult*res){intcount0;inti;for(i0;ires-len;i){if(i0||res-arr[i]!res-arr[i-1]){res-arr[count]res-arr[i];count;}}res-lencount;}intmain(){intarr1[]{6,1,2,1,9,1,3,2,6,2};intarr2[]{4,2,2,1,6,2};intlen1sizeof(arr1)/sizeof(arr1[0]);intlen2sizeof(arr2)/sizeof(arr2[0]);structresultresult;your_concat(arr1,len1,arr2,len2,result);print_result(result);your_sort(result);print_result(result);your_dedup(result);print_result(result);free(result.arr);return0;}11. 指针魔法用你智慧的眼睛透过这指针魔法的表象看清其本质voidmagic(int(*pa)[6],int**pp){**pp(*pa)[2];*pp(*pa)5;**pp-(*pa)[0];*pp(*pa)((*(*pa3)1)?3:1);*(*pp)*(*pp-1);*pp(*pa)2;}intmain(){inta[6]{2,4,6,8,10,12};int*pa1,**ppp;magic(a,pp);printf(%d %d\n%d %d %d\n%d %d\n,*p,**pp,a[1],a[2],a[3],a[5],p-a);return0;}解析二级指针是指向一级指针地址的指针答案6 612 6 810 212. 奇怪的循环你能看明白这个程序怎样运行吗试着理解这个程序吧uniondata{void****p;chararr[20];};typedefstructnode{inta;uniondata b;void(*use)(structnode*n);charstring[0];}Node;voidfunc2(Node*node);voidfunc1(Node*node){node-usefunc2;printf(%s\n,node-string);}voidfunc2(Node*node){node-usefunc1;printf(%d\n,(node-a));}intmain(){constchar*sYour journey begins here!;Node*P(Node*)malloc(sizeof(Node)(strlen(s)1)*sizeof(char));strcpy(P-string,s);P-usefunc1;P-asizeof(Node)*50sizeof(uniondata);while(P-a2028){P-use(P);}free(P);return0;}解析共用体的成员共享同一块内存整体大小等于最大成员的大小。指针在32位环境下占4字节。sizeof(Node) * 50 sizeof(union data)值是1400201420。进入循环后两个函数循环调用。答案Your journey begins here!1421二者交替打印数字依次打印1后的数字。二者各打印608次。