全志 - 嵌入式软件设计工程师 - 笔试

❗❗如果本文对您有帮助,请不要吝啬您的评论、点赞、收藏与小花,这对我非常重要!谢谢!❗❗

alt

本文所涉及的题目均为基于个人学习和理解重新表述的内容,仅供学习交流之用,不代表任何实际考试题目。如有雷同,纯属巧合。

岗位:NO2510 嵌入式软件设计工程师(珠海/广州/西安/深圳)

题型:20 道选择题,2 道填空题,1 道问答题,2 道编程题

1、选择题

1.1

下面程序会输出几个 hello? ==(A)==

int main() {
    fork();
    fork();
    fork();
    printf("hello\n");
    return 0;
}
  1. A. 8
  2. B. 4
  3. C. 6
  4. 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)==

  1. A. 24
  2. B. 22
  3. C. 12
  4. D. 20

解答:

在一个 12 小时周期中,时针、分针和秒针总共会完全重合 11 次,24 小时会重合 22 次

1.3

以下哪个形式,代表声明了一个指向 int 类型变量的指针 p,且 p 的值可修改,但 p 指向的变量值不可修改? ==(AB)==

  1. A. const int *p
  2. B. int const *p
  3. C. int* const p
  4. D. const int* const p

解答:

  1. 选项 A 定义了一个常量指针,指针指向地址的值不可修改
  2. 选项 B 与选项 A 作用一致
  3. 选项 C 定义了一个指针常量,指针指向的地址不可修改
  4. 选项 D 定义了一个指向常量的指针常量,指针指向的地址和指向地址的值均不可修改

1.4

关于多线程,多进程,多任务的区别与关系描述正确的是 ==(C)==

  1. A. 一个进程至多有一个线程,即主线程,也可以有多个线程协同工作
  2. B. 进程从主线程开始执行,它是操作系统的基本调度单元
  3. C. 线程是指进程内的一条执行线路,它是操作系统的基本调度单元
  4. D. 上述说法都是错误的

解答(存疑):

进程是操作系统资源分配的基本单位,线程是 CPU 调度的基本单位
线程也是进程的子任务,一个进程可以有多个线程

1.5

以下哪个机制进程间通信性能最高 ==(D)==

  1. A. 管道
  2. B. 套接字
  3. C. 消息队列
  4. D. 共享内存

1.6

将新元素插入到队列中时,新元素只能插入到 ==(C)==

  1. A. 大于 1 且小于队列元素长度的位置
  2. B. 队头
  3. C. 队尾
  4. 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;
}
  1. A. 1_2
  2. B. 1_b
  3. C. f(1,2)
  4. 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;
}
  1. A. 1
  2. B. 0
  3. C. 4
  4. D. 3

解答:

主函数 main 中实际上调用了一次 fun(2) 和一次 fun(3),并将返回值赋值给了 k,最终输出了 k 的值
关键看 fun 函数中 a = (c++, b++); 语句,逗号表达式将 b++ 的值赋值给 a,但由于 b 为局部变量,两次进入 fun 函数都会重新定义初始化 b=0;,所以始终有 a=0,将 a 的值返回并赋值给 kk 也始终为 0

1.9

以下哪个机制不能实现进程间互斥 ==(A)==

  1. A. 套接字
  2. B. 信号量
  3. C. 自旋锁
  4. D. 互斥锁

解答(存疑):

套接字主要用于进程间通信,而并不是进程间的同步机制

1.10

C 语言程序里使用 malloc 申请了内存,但是没有 free 掉,那么当该进程被 kill 之后的结果是 ==(D)==

  1. A. segmentation fault
  2. B. core dump
  3. C. 内存泄露
  4. D. 以上都不对

解答:

不会出现什么问题,因为 OS 帮你做了处理
即使程序员没有 free 掉申请的内存,在 kill 进程之后,操作系统会自动回收该进程所占用的所有资源,包括动态分配的内存

1.11

若进栈顺序为 abcd,则出栈顺序不可能为 ==(A)==

  1. A. cabd
  2. B. acdb
  3. C. abcd
  4. D. cdba

解答:

a -> push
b -> push
c -> push -> pop -> c
下一步无法 pop 出 a,因为还有 b 在里面

1.12

有以下定义语句 double a[8], *p=a; int i=7;对数组元素错误的引用是 ==(A)==

  1. A. p[++i]
  2. B. *(p+i)
  3. C. *a
  4. D. a[5]

解答:

乍一看索引格式都没问题,但是选项 A 的数组下表溢出了

1.13

一个双向链表中,在节点 a 后面插入 b 节点的操作顺序为 ==(B)==

  1. A. a->next=b; a->next->prev=b; b->prev=a; b->next=a->next;
  2. B. b->prev=a; b->next=a->next; a->next->prev=b; a->next=b;
  3. C. b->prev=a; b->next=a->next; a->next=b; a->next->prev=b;
  4. D. a->next=b; b->prev=a; a->next->prev=b; b->next=a->next;

解答:

  1. b 节点前向指针指向 a 节点
  2. b 节点后向指针指向 a 节点原来指向的后节点
  3. b 节点后面节点的前向指针指向插入的 b 节点
  4. a 节点后向指针指向插入的 b 节点

1

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

欢迎来到我的专栏,在这里,我将整理并分享2024年各大企业的真实笔试/面试真题,同时还整理了嵌入式软件相关的八股知识。专栏内容涵盖C/C++基础、嵌软常见通信协议、ARM、FreeRTOS、Linux OS相关问题汇总,希望能帮助求职者了解考试趋势和嵌入式常见考点。无论你是准备面试,还是希望提升自己的专业知识,这里都能为你提供宝贵的参考和学习资源。

全部评论

相关推荐

评论
3
7
分享

创作者周榜

更多
牛客网
牛客企业服务