第 1 题
题目:简述 static 关键字在 C 语言中的三种使用场景与各自作用 答案:
- 修饰局部变量:变量存储在全局数据区,函数执行结束不销毁,仅首次调用初始化,仅本函数可访问。
- 修饰全局变量:作用域限制在当前.c 文件,其他文件无法 extern 引用。
- 修饰函数:函数仅能在当前源文件内调用,对外隐藏接口,减少命名冲突。
第 2 题
题目:const char *p、char const *p、char *const p 三者有什么区别? 答案:
const char *p/char const *p:指针指向的内容只读,可修改指针本身指向别的地址。char *const p:指针地址固定不可修改,指针指向的数据可读可写。const char *const p:指针地址、指向内容均不可修改。
第 3 题
题目:什么是联合体 union?和 struct 结构体有什么区别?嵌入式有哪些使用场景? 答案: union 联合体所有成员共用同一块内存空间,内存大小等于最大成员长度;struct 每个成员独立分配内存,总大小受内存对齐影响。 使用场景:判断系统大小端、通信协议报文解析、寄存器多格式读取,节省内存空间。
第 4 题
题目:简述内存对齐的规则,嵌入式开发中为什么要重视结构体内存对齐? 答案: 对齐规则:1. 结构体成员偏移量是自身类型字节数整数倍;2. 结构体整体总大小是最大基础成员字节的整数倍。 原因:MCU 硬件访问未对齐内存会产生硬件异常、降低读写速度;解析通信协议、NFC 卡片数据时对齐错误会造成数据解析错乱。
第 5 题
题目:简述悬空指针与内存泄漏的概念、产生原因以及对应的解决办法 答案:
- 悬空指针:堆内存 free 释放后,指针未置 NULL,依旧指向已回收内存。规避:free 后立刻赋值 ptr=NULL。
- 内存泄漏:malloc 分配堆内存后未调用 free 释放,程序运行中可用内存持续减少,最终设备死机。规避:动态内存成对申请释放,嵌入式尽量少用动态分配。