兆易创新嵌入式开发一面,面试官主要问了这些

1. volatile 关键字有什么作用?它能保证线程安全吗?

答案:

volatile 的作用是告诉编译器,这个变量的值可能会被外部因素修改,因此每次使用都要直接从内存中读取,而不是从寄存器或缓存中取值。

它常用于:

  • 中断与主循环共享变量
  • 多线程共享标志位
  • 硬件寄存器映射

volatile不能保证线程安全,因为它只能保证“可见性”,不能保证“原子性”。如果是复合操作,比如 count++,仍然可能发生竞争问题。

2. const#define 的区别是什么?

答案:

const 是有类型的常量,编译器会做类型检查,调试时也更容易定位。

#define 是预处理宏,本质上是文本替换,没有类型信息。

主要区别:

  • const 有类型安全,#define 没有
  • const 更适合定义常量变量
  • #define 更适合条件编译、宏开关、简单宏表达式

在实际开发里,能用 const 的地方通常优先用 const

3. 指针和引用的区别是什么?

答案:

指针本质上是一个变量,保存另一个变量的地址;引用则是变量的别名。

区别主要有:

  • 指针可以为空,引用定义时必须初始化
  • 指针可以改变指向,引用一旦绑定后不能再改
  • 指针需要解引用访问,引用可以像普通变量一样使用
  • 指针占内存,引用本质上更像语法层封装

在 C 语言和嵌入式底层开发中,指针更常用;在 C++ 接口设计中,引用可读性更好。

4. 什么是栈和堆?它们的区别是什么?

答案:

栈和堆都是内存的一部分,但管理方式不同。

栈:

  • 由系统自动分配和释放
  • 存放局部变量、函数参数、返回地址
  • 分配速度快,但空间通常较小

堆:

  • 由程序员手动申请和释放
  • 常用于动态内存分配
  • 更灵活,但容易产生内存泄漏和碎片

嵌入式系统里通常更谨慎使用堆,因为系统往往更强调可控性和稳定性。

5. 什么情况下会发生内存泄漏?在嵌入式中为什么要特别关注?

答案:

内存泄漏是指申请了内存但没有释放,导致这部分内存后续无法再被使用。

常见情况:

  • malloc 后忘记 free
  • 指针被覆盖,原地址丢失
  • 异常流程中提前返回,未释放资源

嵌入式系统中内存本来就有限,而且设备通常需要长期稳定运行,所以内存泄漏积累后可能导致系统越来越慢,甚至崩溃。

6. static 关键字在 C 语言里有哪些作用?

答案:

static 在不同位置有不同含义。

修饰局部变量时:

  • 变量只初始化一次
  • 生命周期延长到整个程序运行期间
  • 作用域仍然只在当前函数内

修饰全局变量或函数时:

  • 作用域限制在当前文件内
  • 防止外部文件访问,起到隐藏作用

在嵌入式中,static 常用于模块内私有函数、私有全局变量和状态保存。

7. 为什么中断服务函数里不建议做复杂逻辑?

答案:

因为中断

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

嵌入式面试八股文全集 文章被收录于专栏

这是一个全面的嵌入式面试专栏。主要内容将包括:操作系统(进程管理、内存管理、文件系统等)、嵌入式系统(启动流程、驱动开发、中断管理等)、网络通信(TCP/IP协议栈、Socket编程等)、开发工具(交叉编译、调试工具等)以及实际项目经验分享。专栏将采用理论结合实践的方式,每个知识点都会附带相关的面试真题和答案解析。

全部评论

相关推荐

牛客62533758...:华为不卡双非,而是卡院校hhhh
点赞 评论 收藏
分享
评论
点赞
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务