西邮linux兴趣小组2019,2020补纳面试题

  • 2019补纳
  • 2020补纳
    • C语言基础
    • 数据结构与算法
    • GNU Linux常识

关于纳新试题,您需要了解:

  • 本题仅作为面试有限参考
  • 为了代码的简洁,略去了大部分不影响理解的预处理指令
  • 题目难度与序号无关
  • 若无特殊声明,均假设在 Linux x86_64 GCC 编译器环境下

关于本篇博客,您需要了解:

  • 在开始阅读补纳试题之前,我建议您首先阅读首纳题,参考如下:
    西邮linux兴趣小组2019-2021三年纳新试题浅析
  • 我会假定您已经具备一定的c语言基础,所以部分解析内容会比较简略。
  • 此外,由于补纳试题难度较高,我个人水平有限,若有错误与不足,欢迎您的指出!!

2019补纳

1

We are Linuxer
下面代码的输出是什么,请试着解释。struct A {long a;int b;};int main(int argc, char* argv[]){struct A num = {0x6e694c756f796978,0x7875};char ch = '0';for(int i = 0; ch; i++){ch = *((char *)&num + i);printf("%c",ch);}printf("\n");return 0;}

输出为

xiyouLinux

首先我们需要知道,对于结构体num:

  • &num
  • &num[0]
  • &num[0][0]
  • &num[0][0].a
    三者意义相同,均为取首地址
    所以,对于ch = *((char *)&num + i);
    &num+0表示为取0x78(十六进制,小端),为十进制120,ASCII转换为x
    &num+1表示为取0x69(原理同上),为十进制105,ASCII转换为i

    最终我们就得到了如上输出,此外,本题的终止条件也很调皮有趣,
    到最后时,ch的值为0 ‘\000’,在C语言中,0即为假,至此,程序结束。

2

改写代码,在不改变const的情况下尝试使用更多的方法改变b的值。
int main(int argc, char* argv[])
{const int b = 10;//自行添加语句,改变变量 b 的值return 0;
}

方法如下:

 const int b = 10;int* a = (int*)(&b);//暴力转换*a = 6;

3

阅读下面的代码,判断a中哪些元素被改变了,解释原因。
struct node {char a;int b;short c;
};
struct n {char a;int b;
};int main(int argc, char* argv[])
{struct node a[2] = {{1,2,3},{4,5,6}};*(int *)((char *)a + 2 * sizeof(struct n)) = 100;return 0;
}

又是熟悉的字节对齐,当初用桶排序省空间的前辈们一定会觉得字节对齐很奢侈吧

 2 * sizeof(struct n) = 2 * 8 = 16

因为有被强制转换,所以16 - 12 = 4刚好使指针移动到a[1].b的首地址
所以5被转换为100;


4

解释以下代码的输出结果。
void func(char* a)
{printf("%lu\n", sizeof(a)) ;printf("%lu\n", strlen(a)) ;
}int main(int argc, char* argv[])
{char a[] = "hello world";char* b = "hello world";printf("%s\n", b);func(a);printf("%lu\n", sizeof(a));printf("%lu\n", strlen(a));return 0;
}

输出如下:

hello world
8
11
12
11

b作为字符串的首地址,用%s即可输出该字符串

又是最基础的sizeof与strlen的区别:

  • sizeof():sizeof(…)是 运算符,而不是一个函数。
  • strlen(): strlen 是函数, 测量的是字符串的实际长度,以’\0’ 结束。
    对于输出12与11很好理解,那么8与11是怎么样的呢?
    可以看出两个sizeof()的结果不一样,观察发现,函数func的实参为指针,指针在题目背景下占据字节数为8。

6

lala和nini是好朋友。有一天lala获得了n个质量不同的蛋糕,
lala想和nini一起分享,让两个人都吃到相同质量的蛋糕。
但是有强迫症的lala不想破坏每块蛋糕的完整性,
请编写程序判断这n个蛋糕是否符合lala的要求。

注意质量不同不破坏每块蛋糕
洛谷入门难度,对于我写的程序,它还有很大的被优化空间,因为我也只是入门程度
为了分到质量相同的蛋糕,块数当然可以不同,程序如下:

#include<stdio.h>int main(int argc, char* argv[])
{int n;//块数int m = 0;//质量int cnt = 0;//计数器,在这里是计量器scanf("%d", &n);int cake[n+1];//防止溢出为其加一,好习惯for(int i = 0; i < n; i++){scanf("%d", &cake[i]);m += cake[i];//蛋糕总质量}if(m % 2 != 0){printf("ERROR\n");//单数均分不了return 0;}for(int i = 0; i < n; i++){cnt += cake[i];if(cnt == m / 2){//计量器达到总质量一半,完成均分printf("开吃!\n");return 0;}else if(cnt > m / 2){cnt -= cake[i];continue;//删除这个蛋糕跳到下一个}}printf("ERROR\n");//遍历完了还没有那就无了return 0;
}

7

注意是编写函数,仅反转顺序,对单独字符并无处理
同时,要注意空格的输入对程序读入的影响

输入: ❐❐❐❐Hello❐❐everyone,❐we❐are❐xiyouLinuxer❐
输出:xiyouLinuxer❐are❐we❐everyone,❐Hello

(尝试了一下还是写不出来,埋个坑,等把栈用熟了拿栈写)


8

下面这段程序有错吗?如果有错请指出并改正。
void func(char* p)
{p = (char* )malloc(sizeof(char));
}int main(int argc, char* argv[])
{char* s = NULL;func(s);strcpy(s, "I love xiyou_linux");puts(s);return 0;
}

在运行时会发生段错误(访问了不可访问的内存,这个内存区要么是不存在的,要么是受到系统保护的。):

原因为:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>void func(char* p)
{p = (char* )malloc(sizeof(char));//在此处确实分配了空间\但函数运行结束后空间就被自动释放了
}int main(int argc, char* argv[])
{char* s = NULL;func(s);strcpy(s, "I love xiyou_linux");puts(s);return 0;
}

修改后如下:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>void func(char* p)
{p = (char*)malloc(sizeof(char));strcpy(p,"i love xiyou_linux!");//直接在函数中输出puts(p);
}int main(int argc,char*argv[])
{char*s = NULL;func(s);return 0;
}

9

在不创建新节点的情况下,逆置一个已给的链表。

(下次一定)


10

运行下列的代码,针对运行结果谈谈自己的理解。
#include<stdio.h>
int main(int argc,char*argv[])
{char c=-1;printf("%x\n",c);printf("%x %d\n",(unsigned char)c,(unsigned char)c);return 0;
}

输出如下:

ffffffff
ff 255
  • 第二行比较好理解,ff即为255的十六进制,255即为-1被强制转换后由于整数越位所以变成最大值255
  • 第一行也是由于整数越位,因为%x会以int类型输出数据,所以-1变成了unsigned int类型的最大值,对应的十六进制就是ffffffff

11

因为未授权问题,使用以下命令授权即可:

chmod -R 755 *

具体参考:
https://blog.csdn.net/qq_41822647/article/details/85345428


2020补纳


C语言基础

  • 简单的错误
请分析下面的程序,指出其中的问题。
#include <string.h>
int main(void)
{char *str = "linux";str[0] = "L";char a;char *t = &a;strcpy(t, str);printf("%s\n", t);
}

jie:

{char *str = "linux";//实际为const char*str[0] = "L";//因为const,所以赋值错误char a;//char *t = &a;//使指针t指向a所在位置strcpy(t, str);//将指针str指向的内容copy到tprintf("%s\n", t);输出将是“linux”
}

  • 传递多维数组参数
请将三维数组 arr 作为实参传递给 func() 并写出 func() 的函数定义。
注:本题目适用于 c99 标准。
int main(void)
{int l = 5, m = 10, n = 20;int arr[l][m][n];
}

代码如下:

void func(int*);int main(void)
{int l = 3, m = 10, n = 20;int arr[l][m][n];for(int i = 0; i < l; i++){for(int j = 0; j < m; j++){for(int k = 0; k < n; k++){arr[i][j][k] = 1;}}}func((int *)arr);return 0;
}void func(int* arr)
{for(int i = 0; i < 3; i++){for(int j = 0; j < 10; j++){for(int k = 0; k < 20; k++){printf("%d ",arr[i*200+j*20+k]);}printf("\n");}printf("\n");}
}

  • 纷乱的指针
int arr[10][5][3];
void *pr1 = (void *)arr;dumpe2fs /dev/sda1|grep -i "Inode size" dumpe2fs /dev/sda1|grep -i "Inode size"
int *pr2 = (int *)arr;
long *pr3 = arr;
char *pr4 = (char *)arr;
int *t[4];
t[0]=(int *)&arr[5];
t[1]=(int *)&arr[1][1][0];
t[2]=t[0];
t[3]=(int *)&t[0];dumpe2fs /dev/sda1|grep -i "Inode size"
/*
- 将 arr 的值记为: A
- 将 t 的值记为: B
- 将 char 类型的变量大小记为 1
- int 大小为 4 , long 大小为 8
- 本题含一处语法错误,请找出。
*/
请以 A+n 的形式说明以下内容的值:
&arr[0][0][0]
&arr[0][0][1]
&arr[0][1][0]
&arr[1][0][0]
&arr[1][0][1]
&arr[0][1][1]
arr
**arr+1
*(*arr+1)
**(arr+1)
*(*arr+1)+1
*(*(arr+1))+1
&arr[1][0][0]+1
&arr[0][2]+1
&arr[1]+1
&arr+1
pr1+2
pr2+2
pr3+2
pr4+2
请以 A+n 或 B+n 的形式说明下列值:
t
t+1
t[0]+1
&t[0]+1
*(&t[0]+1)+1
t[1]
(int(*)[4])t[1]
((int(*)[4])t[1])+1
*((int(*)[3][4])t[2]+1)+1
t[3]
t[3]-1
//long *pr3 = arr; 错误,类型不匹配无法初始化
//请以 A+n 的形式说明以下内容的值:
&arr[0][0][0]   A
&arr[0][0][1]   A+1
&arr[0][1][0]   A+3
&arr[1][0][0]   A+15
&arr[1][0][1]   A+16
&arr[0][1][1]   A+4
arr     A
**arr+1        A+3
*(*arr+1)  A+15
**(arr+1)  A+150
*(*arr+1)+1   A+18
*(*(arr+1))+1 A+153
&arr[1][0][0]+1    A+16
&arr[0][2]+1   A+9
&arr[1]+1  A+30
&arr+1 A+150
pr1+2
pr2+2  A+8
pr3+2  A+16(若正确)
pr4+2  A+2
//请以 A+n 或 B+n 的形式说明下列值:
t   B
t+1    B+8
t[0]+1 ~~不会啦~~
&t[0]+1
*(&t[0]+1)+1
t[1]
(int(*)[4])t[1]
((int(*)[4])t[1])+1
*((int(*)[3][4])t[2]+1)+1
t[3]
t[3]-1

  • 查看二进制
输出一个 int 类型变量的二进制表示 ( 要求 : 不进制转换 )

算法新手模块学习之打印int类型变量的二进制


  • 宏函数
下面代码希望通过宏函数交换两个 int 类型的变量,请结合你对宏函数的理解\
修改下面的代码,并谈谈下面的代码的缺陷。
#define swap(x,y) int tmp=x;x=y;y=tmp;

对宏函数的改进需要用到do(…)while(0)这个很奇怪但却很实用的东西


  • 结构体内存对齐
请谈谈你对 C 语言中, 结构体 中成员在内存中的存储方式的理解。

对于桶排序的用时间换空间有所了解的话,就能更好的理解内存对齐的用空间换时间
参考:C/C++内存对齐详解


  • 编译
请谈谈你对 C 语言使用中,「从源码到可执行文件」的过程的理解。

之前的文章已经有过介绍,此处不再多赘述
参考:编译到底是在干什么


数据结构与算法

  • 括号匹配问题
编写一个函数,判断一个字符串中的括号是否匹配。
字符串中只有 ( 、 ) 、 [ 、 ] 、 { 、 } 这 6 字符,
( 必须与 ) 匹配, [ 必须与 ] 匹配, { 必须与 }匹配。
例如:
{[()]()} 中的括号就是匹配的
([]{)}} 中的括号是不匹配的
请完善下面的函数:
函数接口定义
// 若匹配,返回 1 ;若不匹配,返回 0
//int match(char *str);
  • 判断链表是否有环
请以你能想到的最优的办法判断链表中是否有环。
//链表结点结构体的定义
struct Node
{int val;struct Node *next;
}

  • 递归反转链表
请使用 递归 实现对链表的反转。

这三个题…过段时间一定!
今年的事情今年做


GNU Linux常识

对于linux的学习,我非常推荐您阅读并学习:
Linux 101

  • 链接
你了解 GNU Linux 环境中的软链接与硬链接吗?请谈谈软链接与硬链接的异同。

cp (复制命令)的 -l 和 -s 参数分布为创建硬链接和软链接(又称为“符号链接”)。
简单而言,一个文件的硬链接和软链接都指向文件自身,但是在底层有不同的行为。
对inode概念的理解可以帮助我们理解软,硬链接,说它软其实是因为它会发生源文件删除后路径失效。


  • 文件权限
请简要说明 GNU Linux 环境中文件类型、文件权限、文件属性有哪些。
  • 文件类型
    – 普通文件类型:第一个属性为 [-]
    – 目录文件:第一个属性为 [d]
    – 块设备文件:第一个属性为 [b]
    – 字符设备:第一个属性为 [c]
    – 套接字文件:第一个属性为 [s]
    – 管道文件:第一个属性为 [p]
    – 链接文件:第一个属性为 [l]
  • 文件权限
    – 查看文件的权限:ls -l
    – r 读权限 值:4
    – w 写权限 值:2
    – x 执行权限 值:1
    – - 无权限 值:0
  • 文件属性
    – 使用ls -la列出后,从第一列开始分别是:
    – inode 索引节点编号:544365
    – 文件类型
    – 文件权限
    – 硬链接个数
    – 文件属主
    – 文件属组
    – 文件大小
    – 文件修改时间 这里的时间是该文件最后被更新(包括文件创建、内容更新、文件名更新等)

第一次发布时间:2021.12.13 -未完结

西邮linux兴趣小组2019,2020补纳面试题相关推荐

  1. 西邮Linux兴趣小组2019面试题总结

    西邮Linux兴趣小组2019面试题总结 unsigned int unsigned int 取值范围为0~4294967295,当i减到0后,再进行一次自减,会变为4294967295,永远满足&g ...

  2. 西邮Linux兴趣小组2019补纳题

    下面代码的输出是什么? struct A {long a;int b; }; int main(int argc, char* argv[]){struct A num = {0x6e694c756f ...

  3. 西邮Linux兴趣小组2019纳新试题总结

    1.下面代码段将打印出多少个'='?运用相关知识解释该输出. int main() {for(unsigned int i=3;i>=0;i--){putchar('=');} } 无数个'=' ...

  4. 西邮Linux兴趣小组2019年面试题总结

    #include<stdio.h> int main(int argc,char*argv[]) {for(unsigned int i=3;i>=0;i--)putchar('=' ...

  5. 西邮Linux兴趣小组2021纳新面试题

    #include<stdio.h> #include<string.h> int main(void) {char s[]="I love Linux\0\0\0&q ...

  6. 西邮linux兴趣小组2019-2021三年纳新试题浅析

    西邮linux兴趣小组2019-2021三年纳新试题浅析 西邮 Linux 兴趣小组 2019 纳新试题 西邮 Linux 兴趣小组 2020 纳新试题 西邮 Linux 兴趣小组 2021 纳新试题 ...

  7. 2020西邮linux兴趣小组纳新题题解

    1. 请试着解释其输出. int main(int argc , char *argv[]) {unsigned char a = 255;char ch = 128;a -= ch;printf(& ...

  8. 西邮Linux兴趣小组2020纳新试题题解

    西邮Linux兴趣小组2020纳新试题题解 1. 请试着解释其输出. int main(int argc , char *argv[]) {unsigned char a = 255;char ch ...

  9. 西邮Linux兴趣小组2022纳新面试题题解

    本题目只作为Xiyou Linux兴趣小组2022纳新面试的有限参考. 为节省版面,本试题的程序源码省去了#include指令. 本试题中的程序源码仅用于考察C语言基础,不应当作为C语言「代码风格」的 ...

最新文章

  1. vc 基于对话框实现工具条提示显示
  2. 通过一个简单的例子,了解 Cypress 的运行原理
  3. Oracle存储过程中使用游标来批量解析CLOB字段里面的xml字符串:
  4. 不下载APP就不能看全文?工信部出手了...
  5. python高斯求和_利用Python进行数据分析(3)- 列表、元组、字典、集合
  6. winform中listview选中整行_Excel办公实操,操作区域的3大小技巧,办公中的你使用过吗...
  7. linux 高并发网络编程之epoll详解
  8. TrueCrypt加密安全问题
  9. SRCNN代码及注释
  10. 这图怎么画| 相关性热图+柱状图
  11. 重装系统(win10企业版)
  12. QT编译失败几个常见问题
  13. 设计一个类代表二维空间的一个点,设计一个类代表二维空间的一个圆。要求两个成员变量。一个是圆心,一 个是半径,提供计算面积的方法。为上述Cricle类添加一个方法,计算一个点(Point)是否在圆内
  14. golang: Google Play退款订单数据查询
  15. 【Python异常】TypeError: __init__() got an unexpected keyword argument ‘size‘与gensim.models.word2vec 参数
  16. 最近非常火的ChatGPT到底是个啥?
  17. wine下玩魔兽的设置
  18. 阿里、京东基于DDD的架构设计与最佳实践
  19. 面试中各个类型项目讲解
  20. 【Java】使用idea打jar包

热门文章

  1. 如何实现设备的预测性维护
  2. python获取Agilent 33461A数字万用表读数
  3. 创业公司CTO/技术总监的岗位职责及任职要求
  4. java前端提示反射型xss_解决反射型XSS漏洞攻击
  5. php和javascript的get和post方式 有人串口转wifi模块httpdclient网页交互通信成功源码2 wifi继电器小黄人软件ypnr
  6. 上海交大PMP每日一题
  7. 基于51单片机驱动ADXL346 (LCD1602显示)
  8. 毕业设计ppt模板内容应该写什么
  9. 数据库的统计数据——sysstat
  10. 如何使用线性代数实现最小二乘法拟合曲线