全志 - 嵌入式软件设计工程师 - 笔试
❗❗如果本文对您有帮助,请不要吝啬您的评论、点赞、收藏与小花,这对我非常重要!谢谢!❗❗
本文所涉及的题目均为基于个人学习和理解重新表述的内容,仅供学习交流之用,不代表任何实际考试题目。如有雷同,纯属巧合。
岗位:NO2510 嵌入式软件设计工程师(珠海/广州/西安/深圳)
题型:20 道选择题,2 道填空题,1 道问答题,2 道编程题
1、选择题
1.1
下面程序会输出几个 hello? ==(A)==
int main() {
fork();
fork();
fork();
printf("hello\n");
return 0;
}
- A. 8
- B. 4
- C. 6
- D. 3
解答:
假设原始进程为 A ,调用第一个
fork()
生成进程 B
进程 A、B 均调用第二个fork()
对应生成进程 C 和 D
进程 A、B、C、D 均调用第三个fork()
对应生成进程 E、F、G、H,最终一共有 8 个进程,因此会输出 8 个hello
1.2
一个 12 小时制的跳格式时钟,24 小时里,时、分、秒针可以重合多少次(指针按格跳动)==(B)==
- A. 24
- B. 22
- C. 12
- D. 20
解答:
在一个 12 小时周期中,时针、分针和秒针总共会完全重合 11 次,24 小时会重合 22 次
1.3
以下哪个形式,代表声明了一个指向 int
类型变量的指针 p,且 p 的值可修改,但 p 指向的变量值不可修改? ==(AB)==
- A.
const int *p
- B.
int const *p
- C.
int* const p
- D.
const int* const p
解答:
- 选项 A 定义了一个常量指针,指针指向地址的值不可修改
- 选项 B 与选项 A 作用一致
- 选项 C 定义了一个指针常量,指针指向的地址不可修改
- 选项 D 定义了一个指向常量的指针常量,指针指向的地址和指向地址的值均不可修改
1.4
关于多线程,多进程,多任务的区别与关系描述正确的是 ==(C)==
- A. 一个进程至多有一个线程,即主线程,也可以有多个线程协同工作
- B. 进程从主线程开始执行,它是操作系统的基本调度单元
- C. 线程是指进程内的一条执行线路,它是操作系统的基本调度单元
- D. 上述说法都是错误的
解答(存疑):
进程是操作系统资源分配的基本单位,线程是 CPU 调度的基本单位
线程也是进程的子任务,一个进程可以有多个线程
1.5
以下哪个机制进程间通信性能最高 ==(D)==
- A. 管道
- B. 套接字
- C. 消息队列
- D. 共享内存
1.6
将新元素插入到队列中时,新元素只能插入到 ==(C)==
- A. 大于 1 且小于队列元素长度的位置
- B. 队头
- C. 队尾
- D. 队中
解答:
队列是一种先进先出的线性数据结构,元素只能从队尾插入,从队头删除
1.7
以下代码的输出结果是什么?==(B)==
#include <stdio.h>
#define f(a,b) a##_b
#define g(a) #a
#define h(a) g(a)
int main() {
printf("%s\n", h(f(1,2)));
return 0;
}
- A. 1_2
- B. 1_b
- C. f(1,2)
- D. segmentation fault
解答:
h(f(1,2)) = h(1_b) = "1_b"
如何得到1_2
的输出?为什么没有输出1_2
?
将f(a,b)
的宏定义修改为#define f(a,b) a##_##b
即可
1.8
对于下面代码段,输出是什么?==(B)==
#include <stdio.h>
int fun(int a) {
int b = 0;
static int c = 3;
a = (c++, b++);
return a;
}
int main(int argc, char **argv) {
int a = 2, i, k;
for (i = 0; i < 2; i++)
k = fun(a++);
printf("%d\n", k);
return 0;
}
- A. 1
- B. 0
- C. 4
- D. 3
解答:
主函数
main
中实际上调用了一次fun(2)
和一次fun(3)
,并将返回值赋值给了k
,最终输出了k
的值
关键看fun
函数中a = (c++, b++);
语句,逗号表达式将b++
的值赋值给a
,但由于b
为局部变量,两次进入fun
函数都会重新定义初始化b=0;
,所以始终有a=0
,将a
的值返回并赋值给k
,k
也始终为 0
1.9
以下哪个机制不能实现进程间互斥 ==(A)==
- A. 套接字
- B. 信号量
- C. 自旋锁
- D. 互斥锁
解答(存疑):
套接字主要用于进程间通信,而并不是进程间的同步机制
1.10
C 语言程序里使用 malloc
申请了内存,但是没有 free
掉,那么当该进程被 kill
之后的结果是 ==(D)==
- A. segmentation fault
- B. core dump
- C. 内存泄露
- D. 以上都不对
解答:
不会出现什么问题,因为 OS 帮你做了处理
即使程序员没有free
掉申请的内存,在kill
进程之后,操作系统会自动回收该进程所占用的所有资源,包括动态分配的内存
1.11
若进栈顺序为 abcd,则出栈顺序不可能为 ==(A)==
- A. cabd
- B. acdb
- C. abcd
- D. cdba
解答:
a -> push
b -> push
c -> push -> pop -> c
下一步无法 pop 出 a,因为还有 b 在里面
1.12
有以下定义语句 double a[8], *p=a; int i=7;
对数组元素错误的引用是 ==(A)==
- A.
p[++i]
- B.
*(p+i)
- C.
*a
- D.
a[5]
解答:
乍一看索引格式都没问题,但是选项 A 的数组下表溢出了
1.13
一个双向链表中,在节点 a 后面插入 b 节点的操作顺序为 ==(B)==
- A.
a->next=b; a->next->prev=b; b->prev=a; b->next=a->next;
- B.
b->prev=a; b->next=a->next; a->next->prev=b; a->next=b;
- C.
b->prev=a; b->next=a->next; a->next=b; a->next->prev=b;
- D.
a->next=b; b->prev=a; a->next->prev=b; b->next=a->next;
解答:
- b 节点前向指针指向 a 节点
- b 节点后向指针指向 a 节点原来指向的后节点
- b 节点后面节点的前向指针指向插入的 b 节点
- a 节点后向指针指向插入的 b 节点
1
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
欢迎来到我的专栏,在这里,我将整理并分享2024年各大企业的真实笔试/面试真题,同时还整理了嵌入式软件相关的八股知识。专栏内容涵盖C/C++基础、嵌软常见通信协议、ARM、FreeRTOS、Linux OS相关问题汇总,希望能帮助求职者了解考试趋势和嵌入式常见考点。无论你是准备面试,还是希望提升自己的专业知识,这里都能为你提供宝贵的参考和学习资源。