1.malloc/free和new/delete异同点
内存图:
相同点:
malloc和new都是开辟堆内存空间,free和delete 都是释放堆内存空间
不同点:
(1)malloc和free是函数,new/delete是操作符
(2)malloc开辟空间的时候需要手动计算空间大小,new开辟空间时自动计算空间的大小
(3)malloc函数返回值类型为void*,使用时需要强制类型转换,new后面跟的是空间的类型,不需要强制类型转换
(4)malloc函数开辟空间的时候没有对空间进行初始化的工作,new开辟空间的时候可以对该空间进行初始化赋值操作
(5)malloc函数只能用于基本的数据类型,不能用于自定义类型(结构体除外),new不仅可以用于基本的数据类型,也可以用于自定义类型。
2.sizeof和strlen的区别
(1)sizeof是运算符,strlen是函数
(2)sizeof可以用类型函数作为参数,strlen找你计算char*,它必须以“/0”结尾作为它的一个计算结束标志
(3)sizeof是编译的时候计算,计算的是内存的大小;strlen是运行期间去计算,表示的是字符串长度,不是内存大小
3.struct和union的区别
(1)联合体成员公用同一块地址空间,所以联合体变量字节大小等于成员中字节最大的
(2)对不同成员赋值会影响其它成员读值的结果
4.数组名和指针的区别
(1)指针保存的是地址,数组保存的是数据
(2)数组的名字表示的是整个数组的首地址,也是数组第一个成员的首地址
(3)指针通过地址间接的访问数据,数组通过下标的偏移来访问数据
(4)指针是指针地址值,存储的字节大小,数组计算的是数组的整个空间,也就是所有数据所占的这个内存大小
5.数组清空的方法
(1)bzero函数
(2)memset函数
6.同步IO和异步IO的区别
(1)在同步IO中,当一个IO执行时,应用程序必须等待直到此IO执行完。
(2)在异步IO中,IO操作和应用程序可以同时运行,提高系统性能,提高IO流量
(3)在同步IO中,线程启动一个IO操作,然后就立即进入等待状态,直到IO操作完成后才能醒来继续执行,而异步文件IO中,线程发送一个IO请求到内核,然后继续处理其它的事情。内核完成IO请求后将会通知线程IO完成操作
7.局部变量能否和全局变量重名
编译的时候能通过,实际输出的时候根据就近原则,优先输出局部变量的值。它的本质是因为生命周期和作用域不同,如果想要输出全局变量的值,输出语句要在局部变量的作用域外,这样调用不到局部变量就可以去调用全局变量的值。
8.红黑树
红黑树就是一个自平衡的二叉查找树,树上的每一个节点都遵循:
(1)每一个节点都有红色或黑色
(2)树的根始终是黑色的、红色节点不能有红色父节点或红色子节点
(2)从节点到NULL节点的每条路径上都有相同数量的黑色节点
9. 用预处理指令#define声明一个常数,用于表明一年中有多少秒?(忽略闰年问题)
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
需要注意的是
1.由于宏定义是预处理指令,而非语句,所以在进行宏定义时,不能以分号结束。
2.预处理只会执行简单的替换,不会计算表达式的值,所以要注意括号的使用,直接写出是如何计算出一年中有多少秒,而不是计算出实际的值。
3.意识到这个表达式将使一个16位机的整型数溢出,因此要用到长整型符号L,告诉编译器这个常数是的长整型数。
4. UL:表示无符号长整型
10.写一个标准宏MIN,这个宏输入两个参数并返回较大的一个;
#define MIN(x,y) ((x) > (y) ? (x) : (y))
宏定义的注意两点:
1、数据类型是否有溢出的风险(如一年有多少个秒的宏);
2、带参宏的每个参数都要用括号括起来。
11.串口和并口的区别?
串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口(SerialInterface)是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。并口是8位并排排一起传输。
并口一般指并行接口。并行接口,指采用并行传输方式来传输数据的接口标准。数据的宽度可以从1~128位或者更宽,最常用的是8位,可通过接口一次传送8个数据位。
12.用变量a给出下面的定义
a)一个整型数
int a;
b)一个指向整型数的指针 ,它指向的指针是指向一个整型数
int *a;
c)一个指向指针的的指针,
int **a;
d)一个有10个整型数的数组
int a[10];
e)一个有 10 个指针的数组,该指针是指向一个整型数的。
int *a[10];
f)一个指向有 10个整型数数组的指针
int (*a)[10];
13.关键字 extern, static的作用分别是什么?
extren:
extern放在变量和函数声明之前,表示该变量或者函数在别的文件中已经定义,提示编译器在编译时要从别的文件中寻找。
static:
(1)在修饰变量的时候,static 修饰的静态局部变量只执行初始化一次,而且延长了局部变量的生命周期,直到程序运行结束以后才释放。
(2)static 修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是 extern 外部声明也不可以。
(3)static 修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用。static 修饰的变量存放在全局数据区的静态变量区,包括全局静态变量和局部静态变量,都在全局数据区分配内存。初始化的时候自动初始化为 0。
14.C语言中堆和栈的区别?
1、存储内容不同
栈:在函数调用时,栈中存放的是函数中各个参数(局部变量)。栈底下是函数调用后的下一条指令。
堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。
2、管理方式上不同
栈:由系统自动分配空间,同时系统自动释放空间。例如,声明在函数中一个局部变量“int b“。系统自动在栈中为b开辟空间,当对应的生存周期结束后栈空间自动释放。
堆:需要程序员手动申请并且手动释放,并指明大小。在C语言中malloc函数申请,释放free函数,在C++中new和delete实现。
3、空间大小不同
栈:获取空间较小。在Windows下,一般大小是1M或2M,当剩余栈空间不足时,分配失败overflow。
堆:获得空间根据系统的有效虚拟内存有关,比较灵活,比较大。
4、能否产生碎片不同
栈:不会产生碎片,空间连续。
堆:采用的是链表的存储方式,会产生碎片。
5、生长方向不同
栈:向低地址扩展的数据结构,是一块连续的内存的区域。
堆:向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。
6、分配方式不同
栈:有2种分配方式——静态分配和动态分配。静态由编译器完成,例如局部变量;动态由alloca函数实现,并且编译器会进行释放。
堆:都是动态分配的,没有静态分配的堆。
7、分配效率不同
栈:由系统自动分配,速度较快。但程序员是无法控制的。
堆:由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来方便。
15.简述linux设备驱动中使用中断的步骤?
1.在设备树中添加中断设备节点信息
如:
key_int_node { compatible = "key3"; interrupt-parent = <&gpx1>; interrupts = <2 4>; };
2.获取中断号
//根据路径获取设备树中的节点 struct device_node *of_find_node_by_path(const char *path); 参数: 参数1: const char *path:设备树中节点路径 返回值: 获取到的节点
3.request_irq,申请中断
4.free_irq,释放中断
16.Linux设备驱动程序中,中断下半部分机制?
tasklet、软中断、工作队列