①栈的空间由系统自动分配或释放,堆的空间手动分配或释放
②栈的空间有限,堆上有很大的自由存储空间,malloc分配的空间在堆上,使用完后需要释放
2:static关键词的作用①修饰局部变量,将其生命周期改为与全局变量相同,作用域不变
②修饰全局变量时, 当一个源程序由多个源文件组成时,将其作用域从整个源程序改为该源文件
③修饰函数时,表明该函数作用域为该文件内
3:volatile关键字的作用①与const关键词对立,表示“可变的”,修饰变量时表明该变量需要从内存单元中读取,不能直接从寄存器中拷贝,
②常用于并行设备的硬件寄存器,中断服务子程序访问到的变量,多线程之间被几个任务共享变量
4:进程和线程的区别①进程是系统资源分配的最小单位,线程是程序执行的最小单位
②进程拥有自己独立的地址空间,每次启动一个进程系统会为它分配数据段、代码段、堆栈段,而线程与进程共享相同资源,仅仅拥有自己的局部变量(栈),共享全局变量和堆等,因此cpu开销线程明显小于进程
③线程之间的通信很明显,但要注意互斥和同步,进程间通信用到IPC,主要有FIFO,socket,管道pipe,信号量
④多进程程序不容易崩溃,多线程程序会因为某一线程掉线而崩溃
5:实现strcpy函数char *strcpy(char *strDest, const char *strSrc)
{
if (!(strDest && strSrc))
return NULL;
char *ret = strDest;
while ((*strDest++ = *strSrc++)!=' ');
return ret;
}
6:引用和指针的区别
(1). 指针是一个实体,而引用仅是个别名;
(2). 引用使用时无需解引用(*),指针需要解引用;
(3). 引用只能在定义时被初始化一次,之后不可变;指针可变;
(4). 引用没有 const,指针有 const,const 的指针不可变;
(5). 引用不能为空,指针可以为空;
(6). “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof指针”得到的是指针本身(所指向的变量或对象的地址)的大小;
(7). 指针和引用的自增(++)运算意义不一样;
7:malloc的用法和注意点该函数用于分配堆上的n个字节,并返回指向这块内存的指针,如果分配失败则返回NULL;
注意:①申请了内存空间之后,必须检查是否申请成功
②当不再使用申请的内存,必须进行释放,且释放后必须将指针置NULL,否则会导致野指针
③malloc和free配套使用,申请不释放为内存泄漏,释放多次,会导致错误
④malloc的类型是void*,使用时需要将其强制转换为需要的类型指针
8:C和C++的区别 9:C语言的编译过程 10:排序
①快排,先从数列中取出一个数作为基准值;分区过程中,将比这个数大的数全放在它的右边,比这个数小的全放在它的左边;再对左右分区重复第二步,直到各区间只有一个数。
10:linux驱动相关知识11:嵌入式硬件协议
I2C,SPI,GPIO,
12:自旋锁和互斥锁,读写锁
自旋锁可以在中断中使用,互斥锁会引起阻塞
13:系统调用有哪些,执行过程是怎样的?
14:大小端问题,0x12345678在小端模式存储方式是?
78 56 34 12
15:信号④是用来干嘛的?
用来同步和互斥,如果初始值为0,则用于同步,如果初始值非0,则用于互斥
互斥是死锁的必要条件之一
为什么要字节对齐



