// 最近论文也提交了,等答辩中,也没啥事了,总结一些嵌入式校招面试题吧。
// 写在开头,面试主要是围绕你的简历来问,你写了啥面试官问啥,项目部分必问,经常会问,你这个项目遇到了哪些问题以及如何解决的,建议事先准备一下。
// 这是第一部分,主要是C语言方面的,后续还有操作系统(Linux)、网络、数据结构、单片机之类方面,还有些乱七八糟的。
// 答案有不对的地方欢迎指正。
目录
1、static的作用:
1、static声明全局变量:存放于.data段(已初始化)或者.bss段(未初始化)内,只在定义它的源文件内有效,其他源文件无法访问它。
2、static声明局部变量:(1)放在.data段,在整个生命周期中存在。(2)不能被其他的函数和源文件访问。(3)以后每次调用静态局部变量的时候都用上次调用后的值。
3、static声明函数:解决不同原文件中函数同名的问题,文件中被static声明的函数对其他文件不可见。
2、volatile作用:
1、编译器不要对其进行优化:例如往某寄存器先写1,再写2。不要觉得先写1好像是冗余代码,优化成直接写2。
2、每次都从其地址中读数据:避免从cache中读数据,避免cache中数据没更新等问题。
3、常量指针、指针常量:
1、指针常量:(int *const p)指针自身的值是一个常量,不可改变。在定义的同时必须初始化。
2、常量指针:(const int *p, int const *p)指向“常量”的指针。指针指向的内容不可改变。
4、malloc的底层实现
对于小于128KB的请求来说,它会在现有的堆空间里,按照堆分配算法为其分配一块空间并返回(空闲链表);对于大于128KB的请求,他会使用mmap函数为其分配一块匿名空间增加到堆空间,然后在这块匿名空间中为用户分配空间。当然我们直接用mmap也可以轻易实现malloc函数(直接用mmap映射匿名空间),但是mmap只能以页的整数倍映射,对于小空间的分配会很浪费。
// Linux驱动层是kmalloc:不同的对象分配不同的高速缓存,高速缓存中又被划分为slab,slab一般是一个页(buddy算法,只能取2^n页,一般n为0),在slab中为具体对象进行分配/回收。其中kmalloc就建立在slab层上,使用了一组通用高速缓存。
5、malloc之后free(内存泄漏)
动态分配的内存,使用结束后需要用free释放掉,不然会造成内存泄漏。内存泄漏可以通过重启解决。
6、指针的指针
可以采用如下理解方式:
int a =100;
int *p1 = &a;
int **p2 = &p1;
7、空指针与野指针
(1)空指针:
空类型指针就是void *类型的指针,表示这是一个指针,和地址值有关,但不知道存储在此地址上的对象的类型,在取空类型指针所指向的值的时候,应将空类型指针转换为对应的指针类型
(2)野指针:
不知道指向哪里的指针,如char *p; 此时就不知道p指向哪里。