XiYou-Linux 2018年面试题
文章目录
- 第一题
- 第二题
- 第三题
- 第四题
- 第五题
- 第六题
- 第七题
- 第八题
- 第九题
- 第十题
- 第十一题
- 第十二题
- 第十三题
第一题
int main(int argc, char *argv[])
{ int nums[3][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; printf("%d\n", nums[1][-2] ); printf("%d\n", (-1)[nums][5] ); printf("%d\n", -1[nums][5] ); return 0;
}
运行结果
23
-9
分析
数组的排列如下
1 2 3
4 5 6
7 8 9
一共有三个数组,一 一来看:
要取出数组元素,就要计算出数组元素的地址。设数组 a[rows][cols](即有rows行,cols列),a[i][j]的地址为 a + i*cols + j , 这里是3行3列,故而
①nums[1][-2]的地址计算如下, ,得nums[0][1] = 2
nums + 1*3 + (-2)==nums + 1==nums + 0*3 +1==nums[0][1]==2
②(-1)[nums][5]
(-1)[nums][5] = nums[-1][5]
nums + (-1)*3 + 5 == nums + 0*3 + 2 == nums[0][2] == 3
③-1[nums][5]
-1[nums][5] == - nums[1][5]
nums + 1*3 +5 == -(nums + 2*3 + 2) == - nums[2][2] == -9
第二题
int main(int argc, char *argv[])
{ int a[3][2] = { 2, 0, 1, 8 }; char *str = (char *)malloc(sizeof(char) * 20); strcpy(str, "\0101\\xb2"); printf("%zu\n", sizeof(a)); printf("%zu %d\n", sizeof(a[1][1] =0), a[1][1]); printf("%zu %zu\n", sizeof(str), strlen(str)); return 0;
}
运行结果
24
4 8
8 6
分析
数组排列如下
2 0 1
8 0 0
0 0 0
① a 是一个 int 类型的数组 , 一位四字节,6 位 24 字节。
② 一位四字节 , a[1][1] == 8
③ * 转义字符
第三题
static int a = 2018;
static void func(void)
{static int b; printf("a = %d, b = %d\n", a++, ++b); }int main(int argc, char *argv[]) {func( );func( ); func( ); return 0; }
分析
static 静态变量
把局部变量改变为静态变量后是改变了它的存储方式,即改变了它的生存期。
1.普通局部变量:存储于栈中,使用完毕会立即释放
被 static 修饰的变量总是存在内存的静态区
2.自动变量会随着函数被调用和退出而存在和消失,而static类局部变量不会,它不管其所在的函数是否被调用,都将一直存在
把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围
1.全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同
2.非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。
静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。
static静态函数:使函数的作用域仅局限于本文件,即内部函数。
第四题
下面是一个 C 语言程序从源代码到形成可执行文件的过程,请解释图 中的 ABCD 分别表示什么,在每个阶段分别完成了什么工作?
一个程序从源代码到可执行程序的过程
一、预编译:主要处理源代码文件中的以“#”开头的预编译指令。
1.删除所有的#define,展开所有的宏定义。
2.删除所有的注释,“//”和“/**/”。
…
二、编译:进行一系列词法分析语法分析、语义分析及优化后,生成相应的汇编代码文件。
1.词法分析 2. 语法分析 3. 语义分析 4. 优化 5. 目标代码生成 6. 目标代码优
三、汇编:将汇编代码转变成机器可以执行的指令(机器码文件)
四、链接
第五题
根据所给代码,说明 const 关键字的用法,指出标号为 (1)~(4) 的 代码哪些是错误的。
char y[ ] = "XiyouLinuxGroup", x[ ] = "2018"; char *const p1 = y; const char *p2 = y;/* (1) */ p1 = x ;/* (2) */ p2 = x ; /* (3) */ *p1 = 'x'; /* (4) */ *p2 = 'x';
const关键字
1.const int *p :*p指向的内容无法改变
2.int const *p:*p指向的内容不可改变
3.int * const p: *p不能改变指向,值可以变
4.const int *const p:即不改变指向也不改变内容
分析
1,4错误
2,3正确
总结:
如果const在 * 的左侧,则const用来修饰指针所指向的变量,即指针指向位常量;
如果const位于 * 的右侧,则const就是修饰指针本身,即指针本身就是常量。
const与#define区别
1.#define 宏是在预编译阶段进行替换,而 const 修饰的只读变量是在编译的时候确定其值
2…#define 宏没有类型,而 const 修饰的只读变量具有特定的类型
第六题
猜想下面程序的输出,并谈谈自己的理解。
int main(int argc, char *argv[])
{ int a[5]; printf("%p\n", a); printf("%p\n", a+1);printf("%p\n", &a); printf("%p\n", &a+1);return 0; }
打印数组地址,每个计算机的结果都有可能不同,这里不打印我的结果
主要讲一下知识点
数组名+1与&数组+1
a即a[0]的地址。 a+1取的是a[1]的地址,即在数组首地址上加上一个int型大小空间。
&a取的也是数组首地址 。 &a+1中的&a代表整个数组, +1后就是跳过这个数组,即加上5个int大小的空间
第七题
谈谈你对 main 函数的理解,可以从参数、返回值等角度分析。
int main(int argc, char *argv[]){/*...*/}
程序由主函数开始运行,由主函数结束,主函数可调用任何函数,任何函数都不可以调用主函数
argc:参数的个数。argv[]:是一个字符指针数组,每一个元素指向一个字符串。argv[0]:指向程序的路径名,argv[1…]:指向第n个参数对应的字符串
第八题
分析以下函数,给出 f(2018) 的值,推测并验证函数的作用。
int f(unsigned int num) { for (unsigned int i = 0; num; i++) {num &= (num - 1);}return i; }
位操作
&运算符,两个数对应的二进制位都为1结果为1 ,否则 为 0
第一次循环num=2018&2017等价于11111100010&11111100001 结果为11111100000,即 num = 2016
第二次循环num=2016&2015等价于11111100000 & 11111011111 结果为 11111000000,即num=1984
第三次循环num=1984&1983等价于11111000000&11110111111结果为11110000000,即num=1920
第九题
分析以下代码段,解释输出的结果。
int main(int argc, char *argv[]) { char n[] = { 1, 0, 0, 0 }; printf("%d\n", *(int *)n); return 0; }
大小端
分析
强制转换为int*类型,按大小端模式读出,如果是小端就是0000 0000 0000 0000 0000 0000 0000 0001
第十题
分析以下代码段,解释输出的结果。
#define YEAR 2018
#define LEVELONE(x) "XiyouLinux "#x"\n"
#define LEVELTWO(x) LEVELONE(x)
#define MULTIPLY(x,y) x*y
int main(int argc, char *argv[])
{ int x = MULTIPLY(1 + 2, 3); printf("%d\n" , x); printf(LEVELONE(YEAR));printf(LEVELTWO(YEAR));
}
第十一题
以下代码段输出的两个值相等吗?为什么?
struct icd { int a; char b;double c; };struct cdi{char a; double b; int c;};
int main(int argc, char *argv[])
{ printf("%zu %zu\n", sizeof(struct icd), sizeof(struct cdi)); return 0;}
运行结果
16 24
涉及知识点,结构体对齐
对齐规则
1.第一个成员在与结构体变量偏移量(offset)为0的地址处。
2.其他成员变量要对齐到对齐数的整数倍的地址处。
(1)对齐数 = 对齐系数 与 该成员大小的较小值。
(2)#pragma pack(n);中的n就是对齐系数。
(3)VS中默认的值为8;linux中的默认值为4。
3.结构体总大小为最大对齐数(每个成员变量除了第一个成员都有一个对齐数)的整数倍。
4.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍
第十二题
在以下代码段执行完毕后,文件 Linux.txt 中的内容是什么?
int main(int argc, char *argv[]){ FILE *fp = fopen("Linux.txt", "wb");long long a = 0x78756e694c; fwrite(&a, sizeof(a), 1, fp); fclose(fp); return 0; }
运行结果
Linux
第十三题
判断以下代码是否存在问题,如果有请找出并做适当的修改。
typedef struct a
{char *name; int num;
} A;
void func(A *a)
{ a = (A *)malloc(sizeof(A)); strcpy(a->name , "XiyouLinuxGroup"); a->num = 2018;
}
int main(int argc, char *argv[])
{ A *a; func(a); printf("%s %d\n", a->name, a->num); return 0;
}
XiYou-Linux 2018年面试题相关推荐
- xiyou linux 2018面试题基本知识点
数组 num[3][3]={1,2,3,4,5,6,7,8,9} num[1][-2]==num[0][1]==2: 取某个元素时,是先通过计算这个元素的地址,再通过计算得来的地址取得该元素的.设数组 ...
- Xiyou Linux Group 2017,2018,2019面试题
西邮Linux2017纳新题 1. //分析下列程序的输出 int main(int argc, char *argv[]) {int t = 4; printf("%lu\n", ...
- 2013 2014 2015 2016 Xiyou Linux Group 免试题揭秘
首先给出原来几届的免试题解析链接: 2013 Linux 兴趣小组免试题解析 2014 Linux 兴趣小组免试题解析 2015 Linux 兴趣小组免试题解析 目前2016 Linux 兴趣小组免试 ...
- Xiyou linux 2017 面试题基本知识点
sizef int main() { int t=4; printf("%lu",sizeof(t–)); printf("%liiigviiilu",size ...
- Xiyou linux 2019面试题知识点
1.unsigned int 与 int unsigned int (1)32位,无符号整型的取值是32个0到32个1,即:0~4294967295 (2) 我们举个例子:32位有点长,所以我们拿16 ...
- 西邮linux小组2019-2021面试题总结
这篇文章是对linux 近三年的纳新面试题的小小总结,篇幅有点长,希望你可以耐心看完,看完你一定有收获,有什么不妥可以提出的吖 知识点一:sizeof()和strlen()的异同 先看道题我们再来总结 ...
- 西邮Linux小组2019-2021面试试题二三事
目录 1.关于static 2.)关于printf()返回值 3.sizeof 和strlen() 4.数据的溢出 5.有关运算符 1.)|和|| 2.)<<和>> 6.关于c ...
- 西邮Linux兴趣小组面试题总结(2020)
面试题总结 宏定义 #define 标识符 字符串 2019年面试题 下面代码段的输出结果是什么?输出该结果的原因是? #define X a + b int main(int argc, char ...
- Xiyou Linux Group 2021
西邮Linux兴趣小组2021纳新面试题题解 感谢 Zhilu 重新录入题目原件.好人一生平安. 注: 本题目仅作西邮Linux兴趣小组2021纳新面试题的有限参考. 为节省版面本试题的程序源码中省略 ...
- 2020西安邮电大学linux兴趣小组面试题
1.运行下面代码段 #include<stdio.h> int i; int main(){i--;if(i>sizeof(i)){printf(">\n" ...
最新文章
- MySQL5.7登陆数据库管理控制平台问题 ERROR 1045(28000)
- 【翻译】HTML5开发——轻量级JSON存储解决方案Lawnchair.js
- GitHub因“纳粹”评论遭解雇的犹太员工被复职,CEO公开致歉,开除他的HR走人...
- [转] GDBT详解
- [codevs 1904] 最小路径覆盖问题
- Solrj实现增删改查
- ASP.NET Core 1.1 简介
- java 日期数组_Java数组
- 17款优秀的Vue UI组件库汇总
- CentOS6.7 mysql5.6.33修改数据文件位置
- 全信考试JAVA_2010年全国信息技术水平考试JAVA样题
- .net core 与ELK(4)后台运行els可视化工具和Kibana
- [20171120]11G关闭直接路径读.txt
- 动态内存申请函数 malloc_malloc 的实现原理 内存池 mmap sbrk 链表
- 【通关计划】进入IT培训魔域这个红海,ITbegin为何选择从高校编程教
- 全国城市行政区划码Json格式
- 菲涅尔单缝衍射matlab,单缝菲涅尔衍射的光强分布.pdf
- office转pdf(在线预览)思路(java示例)
- 韩寒式的幽默-屌丝回忆录
- android防止程序休眠,android 设置 永不休眠