单片机岗位常见面试问题——C语言(4)
一、结构体字节对齐
字节对齐就是规定数据在内存中的存储起始地址必须是某个特定字节数(通常是数据类型的大小)的整数倍。 这是读取效率问题,用时间换空间的最好例子。
二、联合体
在同一地址空间中存储不同类型的数据,实例:用来分离高低字节。举例:实习的时候开发采集模块时,485采集到的数据是会根据组合方式来进行计算,比如DCBA的形式,会采用结构体嵌套联合体的方式重新组合成ABCD形式以后再进行后续计算。
三、类型转换
将 uint32_t 数据赋值到 uint8_t 数组中
uint32_t data = 123;
uint8_t databuf[4] = {0};
*( (uint32_t *)databuf ) = data;
//等价于memcpy(databuf, &data, 4);
四、隐式类型转换
C 语言中不同类型的数据需要转换成同一类型,才可以计算
转换规则:
1. 转换按照数据长度增加的方向进行,以保证精度不降低。如 int 和 double相加时,int 会被隐式转换成 double 类型
2. 如果两种类型的字节数一样,且一种有符号,另一种无符号,则转换成无符号类型
3. char 类型和 short 类型参与运算时,必须先转换成 int 类型(整型提升)
五、比较浮点数
整形是以补码的方式存储
对于32位的浮点数,在内存中最高的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M
// float 4byte
abs(a-b) < 0.00001 1e^-5; //近似a==b
// double 8byte
// 判断阈值更小,16位左右
六、为什么局部变量未定义时,每次初始化的结果是不确定的
定义局部变量,其实就是在栈中通过移动栈指针,来给程序提供一个内存空间和这个局部变量名绑定。因为这段内存空间在栈上,而栈内存是反复使用的(脏的,上次用完没清零的) ,所以说使用栈来实现的局部变量定 义时如果不初始化,里面的值就是一个垃圾值。
七、变长结构体(柔性数组)
在结构体中定义长度为0的数组,用以后续开辟变长buf,释放时仅释放结构体即可。
实例:ringbuffer
八、CRC校验
循环冗余校验, 它的基本原理是通过多项式除法来生成一个固定长度的校验码,以检测数据在传输或存储过程中是否发生了错误。
包括c语言常见知识和语法,数据结构,通信协议,STM32,计算机体系结构和硬件,freertos等等