
最近,秋招季节来临,嵌入式工程师的笔试题目成为了大家热议的话题。许多准备面试的朋友们在微信群中分享了各自的笔试题,有一个朋友甚至把他收集到的一套题发了出来。为了帮助大家更好地应对笔试,我决定将这些题目整理出来,并附上我的理解。无论你是在准备面试,还是想复习C语言,这篇文章都适合你。
首先,我们来看看一些常见的嵌入式笔试题。
第1题:#ifdef、#else、#endif、#ifndef 的作用是什么?这四个是预处理器的条件编译指令,编译前由预处理器处理,条件不成立的代码块直接被裁掉,不会占用Flash。它们的作用分别是:
- #ifdef:当宏被定义时,编译后面的代码。
- #ifndef:当宏未被定义时,编译后面的代码。
- #else:条件不成立时执行的代码块。
- #endif:结束条件编译块。
在实际工程中,#ifdef常用于头文件守卫、调试开关和功能裁剪。
第2题:strcpy、sprintf、memcpy的区别,哪个效率最高?这三个函数的作用分别是:
- strcpy:拷贝字符串,遇到‘\0’停止。
- sprintf:将格式化结果写入缓冲区,处理逻辑较复杂。
- memcpy:按字节拷贝任意内存块,效率最高。
效率排序为:memcpy > strcpy > sprintf,原因在于memcpy的长度已知,库可以进行优化。
第3题:C程序在内存中的五个区域是什么?从低地址到高地址依次为:代码区、常量区、全局区(静态区)、堆、栈。各区域的分工各异,代码区存储机器指令,常量区存储字符串和常量,全局区存储全局变量,堆用于动态内存分配,栈用于存储局部变量和函数参数。
第4题:进程的状态有哪些,进程和线程有什么区别?进程有就绪、运行、阻塞三种状态,进程是资源分配的基本单位,而线程是CPU调度的基本单位。
第5题:列举几个Linux常用指令。比如:
- 文件目录:ls -l、cp -r
- 查看文件:cat、less、tail -f
- 搜索:grep -rn
- 进程管理:ps aux | grep xxx、kill -9 PID
- 系统调试:dmesg、free -h、df -h。
第6题:static和volatile的用法和场合。static修饰局部变量时,会在静态存储区分配内存,值会保持到下次调用。volatile用于告诉编译器变量可能会被外部因素改变,禁止优化。
第7题:进程间通信的三种方式。主要有管道、消息队列和共享内存。
- 管道:内核里的一段环形缓冲区。
- 消息队列:内核维护的消息链表。
- 共享内存:多个进程共享同一块物理内存,速度最快。
第8题:IP地址和MAC地址的区别。IP地址是逻辑地址,决定包裹最终送到哪;而MAC地址是物理地址,标识每一段运输途中交接的站点。
第9题:GCC编译分为几个阶段?四个阶段:预处理、编译、汇编、链接。每个阶段都有对应的选项,可以单独查看中间产物。
第10题:new/delete与malloc/free的区别。new/delete会调用构造和析构函数,而malloc/free则不会。两者的配对使用也非常重要,混用可能导致未定义行为。
这些题目看似基础,却是嵌入式工程师必备的知识。通过平时的练习和积累,大家一定能够在笔试中游刃有余。祝正在找工作的朋友们都能顺利拿到心仪的offer!












