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

感谢 Zhilu 重新录入题目原件。好人一生平安。

注:

  • 本题目仅作西邮Linux兴趣小组2021纳新面试题的有限参考。
  • 为节省版面本试题的程序源码中省略了#include指令。
  • 本试题中的程序源码仅用于考察C语言基础,不应当作为C语言代码风格的范例。
  • 题目难度与序号无关。
  • 所有题目均假设编译并运行x86_64 GNU/Linux环境。

Copyright © 2021 西邮Linux兴趣小组, All Rights Reserved.
本试题使用采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。

1. 大小和长度竟然不是一个意思

sizeof()strlen()有什么异同之处?

他们对于不同参数的结果有什么不同?请试举例子说明。

int main(void) {char s[] = "I love Linux\0\0\0";int a = sizeof(s);int b = strlen(s);printf("%d %d\n", a, b);
}

result:

16 12

solution:

sizeof()计算‘\0’字符,结果为16.
而strlen()不计算‘\0’,结果为12.

2. 箱子的大小和装入物品的顺序有关

test1test2都含有:1个short、1个int、1个double,那么sizeof(t1)sizeof(t2)是否相等呢?这是为什么呢?

struct test1 {int a;short b;double c;
};
struct test2 {short b;int a;double c;
};
int main(void) {struct test1 t1;struct test2 t2;printf("sizeof (t1) : %d\n", sizeof(t1));printf("sizeof(t2): %d\n", sizeof(t2));
}

result:

sizeof(t1): 16
sizeof(t2): 16

3. 哦,又是函数

想必在高数老师的教导下大家十分熟悉函数这个概念。那么你了解计算机程序设计中的函数吗?请编写一个func函数,用来输出二维数组arr中每个元素的值。

/*在这里补全func函数的定义*/
int main(void) {int arr[10][13];for (int i = 0; i < 10; i++) {for (int j = 0; j < 13; j++) {arr[i][j] = rand();}}func(arr);
}

result 1

//使用数组接收参数
void func(int arr[10][13]){for(int i=0;i<10;i++){for(int j=0;j<13;j++){printf("%d ", arr[i][j]);}}
}

result 2

//使用指针接收参数
void func(int **p){for(int i=0;i<10;i++){for(int j=0;j<13;j++){printf("%d ", (*(p+i))+j);}}
}

4.就不能换个变量名吗?

  • 请结合下面的程序,简要谈谈传值传址的区别。
  • 简要谈谈你对C语言中变量的生命周期的认识。
int ver = 123;//记为ver1,为全局变量
void func1(int ver) {ver++;//1026printf("ver = %d\n", ver);
}
void func2(int *pr) {*pr = 1234;printf("*pr = %d\n", *pr);pr = 5678;//pr地址变量改变,不再指向verprintf("ver = %d\n", ver);//为全局变量123
}
int main() {int a = 0;//记为a1int ver = 1025;//记为ver2生命周期为main()函数内有生命for (int a = 3/*此处的a2只在for循环中有生命*/; a < 4; a++) {static int a = 5;//a3在for函数块内有生命printf("a = %d\n", a);a = ver;func1(ver);//传入参数1025int ver = 7;printf("ver = %d\n", ver);func2(&ver);//传址可从函数}printf("a = %d\tver = %d\n", a, ver);//a1=0,ver2=1025
}

result

a = 5
ver = 1026
ver = 7
*pr = 1234
ver = 123
a = 0   ver = 1025

5. 套娃真好玩!

请说明下面的程序是如何完成求和的?

unsigned sum(unsigned n) { return n ? sum(n - 1) + n : 0; }//递归100+=99+=98+=...+=0.并返回结果
int main(void) { printf("%u\n", sum(100)); }//传入参数100

result

5050

6. 算不对的算术

//%hx 代表以16进制的 输出short类型的整数
void func(void) {short a = -2;unsigned int b = 1;b += a;//结果是-1,但是由于b是无符号整数,输出为b=0xffffffffint c = -1;unsigned short d = c * 256;//d=0xffffff00c <<= 4;//c=-16int e = 2;//e:0000 0000 0000 0000 0000 0000 0000 0010e = ~e | 6;//~e:1111 1111 1111 1111 1111 1111 1111 1101//6 :0000 0000 00000 0000 0000 0000 0000 0110//e: 1111 1111 1111 1111 1111 1111 1111 1111即e=0xffffffffd = (d & 0xff) /*d=0*/+ 0x2022;//d=0x2022printf("a=0x%hx\tb=0x%x\td=0x%hx\te=0x%x\n", a, b, d, e);printf("c=Ox%hhx\t\n", (signed char)c);//(signed char)c:1001 0000//以short类型输出结果为c=Oxf0
}

result:

a=0xfffe        b=0xffffffff    d=0x2022        e=0xffffffff
c=Oxf0

7. 指针和数组的恩怨情仇

int main(void) {int a[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};int(*b)[3] = a;//b->{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}++b;//b->{{4, 5, 6}, {7, 8, 9}}a->{{1, 2, 3}, {4, 5, 6}, {7, 10, 9}}b[1][1] = 10;//b->{{4, 5, 6}, {7, 10, 9}}int *ptr = (int *)(&a + 1);//{{1, 2, 3},{4, 5, 6}, {7, 10, 9}}<-ptrprintf("%d %d %d \n", a[2][1], **(a + 1), *(ptr - 1));
}

result:

10 4 9

8. 移形换位之术

下面有abc三个变量和4个相似的函数。

  • 你能说出使用这三个变量的值或地址作为参数分别调用这5个函数,在语法上是否正确吗?
  • 请找出下面的代码中的错误。
  • const intint const是否有区别?如果有区别,请谈谈他们的区别。无区别
  • const int *int const *是否有区别?如果有区别,请谈谈他们的区别。无区别
int a = 1;
int const b = 2;
const int c = 3;
void funco(int n) {n += 1;n = a;
}
void func1(int *n) {*n += 1;n = &a;
}
void func2(const int *n) {*n += 1;n = &a;//n指针不能改变
}
void func3(int *const n) {*n += 1;//不能通过n去改变变量的值n = &a;
}
void func4(const int *const n) {*n += 1;n = &a;//值和址都不能改变
}

9. 听说翻转字母大小写不影响英文的阅读?

请编写convert函数用来将作为参数的字符串中的大写字母转换为小写字母,将小写字母转换为大写字母。返回转换完成得到的新字符串。

char *convert(const char *s);
int main(void) {char *str = "XiyouLinux Group 2022";char *temp = convert(str);puts(temp);
}

result

char *convert(const char *s){char*arr=(char*)malloc(sizeof(char)*(strlen(s)+1));strcpy(arr,s);for(int i=0;arr[i]!=0;i++){if(arr[i]>='A'&&arr[i]<='Z'){arr[i]+=32;}else if(arr[i]>='a'&&arr[i]<='z'){arr[i]-=32;}
}return arr;

10. 交换礼物的方式

  • 请判断下面的三种Swap的正误,分别分析他们的优缺点。
  • 你知道这里的do {...} while(0)的作用吗?
  • 你还有其他的方式实现Swap功能吗?
#define Swap1(a, b, t) \ // \可用于一行的结尾,表示本行与下一行连接起来do {              \   t = a;             \a = b;             \b = t;         \    } while (0)
#define Swap2(a, b) \do {              \int t = a;      \a = b;          \b = t;          \} while (0)
void Swap3(int a, int b) {int t = a;a = b;b = t;//不能改变main()函数a,b的值}

result:

swap1,swap2是正确的,dowhile语句使宏定义可以包含多个语句,并减少报错。
swap3函数传值,不能改变main函数中原参数的值。

11. 据说有个东西叫参数

你知道argcargv的含义吗?请解释下面的程序。你能在不使用argc的前提下,完成对argv的遍历吗?

int main(int argc, char *argv[]) {printf("argc = %d\n", argc);for (int i = 0; i < argc; i++)printf("%s\n", argv[i]);
}

solution

argc是传给main()函数命令的参数,argv是命令的表现形式,无命令时系统会输入一条命令因此argc=1.

for (int i = 0; argv; i++)printf("%s\n", argv[i]);
}

12. 人去楼空

这段代码有是否存在错误?谈一谈静态变量与其他变量的异同。

int *func1(void) {static int n = 0; n = 1;return &n;//无法返回局部变量的地址
}
int *func2(void) {int *p = (int *)malloc(sizeof(int));*p = 3;return p;
}
int *func3(void) {int n = 4;return &n;
}
int main(void) {*func1() = 4;*func2() = 5;*func3() = 6;
}

solution

静态变量:效果近乎等于全局变量,但位于函数内部,有利于模块化。

13. 奇怪的输出

int main(void) {int data[] = {0x636c6557, 0x20656d6f, 0x78206f74,0x756f7969, 0x6e694c20, 0x67207875,0x70756f72, 0x32303220, 0x00000a31};puts((const char*)data);
}

result

Welcome to xiyou Linux group 2021

solution

采用小端存储模式即低字节存储在低地址。

14. 请谈谈对从「C语言文件到可执行文件」的过程的理解

solution

预处理(处理#语句,生成.i)->编译(语法,生成.s) ->汇编(转换成汇编语言,生成.o)->链接(组合成可执行文件,.exe)

15. (选做) 堆和栈

你了解程序中的栈和堆吗?它们在使用上有什么区别呢?请简要说明。

solution

16. (选做) 多文件

一个程序在不使用任何头文件的情况下,如何使用另一个文件中的函数。

solution

17. (选做) GNU/Linux与文件

  • 你知道如何在 GNU/Linux下如何使用命令行创建文件与文
    件夹吗?
  • 你知道GNU/Linux下的命令ls 的每一列的含义吗?
  • 你知道GNU/Linux下文件的访问时间、修改时间、创建时间如何查看吗?并简单说说他们的区别。

恭喜你做完了整套面试题,快来参加西邮Linux兴趣小组的面试吧!

西邮 Linux兴趣小组面试时间:
2021年10月25日至2021年10月31日晚8点。
听说面试来的早一点更能获得学长学姐的好感哦。

我们在FZ103等你!

Xiyou Linux Group 2021相关推荐

  1. Xiyou Linux Group 2017,2018,2019面试题

    西邮Linux2017纳新题 1. //分析下列程序的输出 int main(int argc, char *argv[]) {int t = 4; printf("%lu\n", ...

  2. Xiyou Linux Group 2020

    西邮Linux兴趣小组2020纳新试题题解 感谢 Zhilu 重新录入题目原件.好人一生平安. 注: 本题仅作为面试有限参考 为节省版面,省去所有#include指令 题目难度与序号无关 若无特殊声明 ...

  3. 2013 2014 2015 2016 Xiyou Linux Group 免试题揭秘

    首先给出原来几届的免试题解析链接: 2013 Linux 兴趣小组免试题解析 2014 Linux 兴趣小组免试题解析 2015 Linux 兴趣小组免试题解析 目前2016 Linux 兴趣小组免试 ...

  4. XUPT Linux Group 2020 2021 2022 note

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

  5. Xiyou Linux兴趣小组2020纳新试题

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

  6. Xiyou linux 2017 面试题基本知识点

    sizef int main() { int t=4; printf("%lu",sizeof(t–)); printf("%liiigviiilu",size ...

  7. Linux课2021

    Linux课2021 我把Linux学习分成6个阶段,每个阶段都需要至少一天以上的学习: 第1阶段:把linux系统玩得跟Windows或者MacOS那样的桌面操作系统一样顺畅,主要目的就是去可视化, ...

  8. 2022-07-17 Linux group与user基础概念

    Linux group与user基础概念 概念 user 用户 group 用户组 Linux 命令使用 user 用户 useradd 添加用户 userdel 删除用户 usermod 修改账号 ...

  9. Xiyou linux 2019面试题知识点

    1.unsigned int 与 int unsigned int (1)32位,无符号整型的取值是32个0到32个1,即:0~4294967295 (2) 我们举个例子:32位有点长,所以我们拿16 ...

最新文章

  1. c语言编程存航线,C语言编程飞机订票系统如何设计?
  2. me21n增强BADI:ME_PROCESS_PO_CUST之process_account
  3. 快速设置 App 图标 - iOS/Android
  4. jvm_虚拟机组成部分概述
  5. django报错:ImproperlyConfigured和AppRegistryNotReady
  6. [C++][代码库]Vector3空间向量类
  7. Spark scala和java的api使用
  8. Mac电脑问题:磁盘读写NTFS怎么不行?
  9. web服务-Axis2的安装
  10. python3小程序代码_我想使用python写一个小程序作为练习,使用的是python3。
  11. Shell 脚本加密工具-shc
  12. 打开QQ音乐检测不到声卡
  13. Xdebug中文文档-变量打印特性
  14. 01时态(1):疑问句
  15. filezilla关闭更新检测
  16. lna的噪声参数以及功率传输S11 S22
  17. 广义相加模型(GAM)与向前逐步选择算法(基于R语言)
  18. Fast DDS入门二、Fast DDS在Windows平台的编译安装
  19. 计算机描述不可用win10,解决win10打印机不可用描述的方法
  20. [原]利用极域电子教室控制别人电脑

热门文章

  1. windwos安装autocad2018报错 错误1327 驱动器无效D:\
  2. Mastering_Rust(译):宏(第八章)(完+1)
  3. Extjs iconCls 的用法
  4. sap 标准委外和工序委外_SAP PP-SAP委外工序业务配置及操作手册 -
  5. 前端框架——AmazeUI学习
  6. ylbtech-SubwayNav(地铁线路导航)-数据库设计
  7. 在windows中配置jsp环境(超详细)
  8. Android 抽屉菜单滑动时模糊背景 | 毛玻璃效果
  9. 绝缘监测系统设备解决方案在工厂的研究应用-船舶电力系统
  10. BZOJ 4338 BJOI2015 糖果