C/C++、嵌入式Linux校园招聘面试准备篇

一.自我介绍

  • 您好,我叫 XXXX大学 XX专业 XX届 本科学生。
  • 本次应聘贵公司软件开发工程师一职,喜欢计算机技术和编程,平时使用最多的编程语言是XX语言。想要成为一名黑客,在校学习成绩XX,做过一些小的项目或实验,也参加过专业相关的学科竞赛,像计算机系统能力竞赛、大学生电子设计竞赛,同时也取得了一定的成绩。
  • 项目方面,我大概介绍一下。
    • 首先…
    • 接着…
    • 然后…
    • 最后…
  • 另外,参加学校组织的实习和项目实训的时候,也会做一些上层应用,像WEB前端网页 微信小程序这些。

二. 软实力

个人未来规划

  • 入职后尽快熟悉业务流程
  • 深入理解计算机底层知识,提高自己的编程能力
  • 未来成为一名软硬兼备的系统级黑客

业余兴趣爱好

  • CSDN Github MOOC Game Read Music

为什么选择我们公司

  • 上公司官网

优缺点

  • 善良、踏实
  • 律己、律人

提问面试官

  • 如果我面试通过,我将要参与什么样的工作?(感觉不错)
  • 如果我面试通过,入职后会有怎样的培训体系?(感觉不错)
  • 感谢您这次对我的面试,请问我的经历和能力,有哪些是不符合公司预期的吗?或者您觉得我有哪些方面需要加强的吗?(感觉有点凉)

三.专业技能储备

C/C++语言篇

  • 平时哪个语言用的多,说一下C、C++、java的区别。

    • 我用C语言最多,C++了解基本语法和面向对象思想,Java仅仅是在学校学过,考试成绩还不错。
      • C: 面向过程的语言,编译型语言,模块化设计思想,计算机专业必学,贴近硬件,直接操作内存,适合编写操作系统等系统软件,代码执行效率高,可重用性差。
      • C++: 半面向对象语言,编译型语言,C的超集,继承了C语言的高效,并扩展了一系列新内容,面向对象编程、泛型编程和过程化编程。 其编程领域众广,常用于系统开发,引擎开发等应用领域。
      • Java: 全面向对象语言,半编译半解释,先编译为字节码,再由虚拟机解释执行,互联网语言,特别适合大型框架结构开发。
  • C++ 的关键字(保留字)完整介绍

  • C语言篇

    • extern
      • 声明变量在外部定义?
        extern修饰函数?
        extern C的作用?用法?
        extern(外部的)声明变量或函数为外部链接,即该变量或函数名在其它文件中可见。被其修饰的变量(外部变量)是静态分配空间的,即程序开始时分配,结束时释放。用其声明的变量或函数应该在别的文件或同一文件的其它地方定义(实现)。在文件内声明一个变量或函数默认为可被外部使用。在 C++ 中,还可用来指定使用另一语言进行链接,这时需要与特定的转换符一起使用。目前仅支持 C 转换标记,来支持 C 编译器链接。使用这种情况有两种形式:
      extern "C" 声明语句
      extern "C" { 声明语句块 }
      
    • static
      • 局部变量?生命周期?static关键字(全局,局部,成员变量,成员函数)存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和 static 变量 static 的第三个作用是默认初始化为 0。其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是 0x00,某些时候这一特点可以减少程序员的工作量。比如初始化一个稀疏矩阵,我们可以一个一个地把所有元素都置 0,然后把不是 0 的几个元素赋值。
      • C语言中
        • 在全局变量前使用,说明此变量紧在本文件中可见,对外部文件不可见;
        • 在局部变量前使用,说明此局部变量在该函数调用结束后,变量空间并不释放,知道整个程序结束;
        • 在函数前使用,说明此函数仅可被当前文件调用,对外部文件不可见。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。
      • C++中还有更高级的用法,以前查过,具体忘了
        • C/C++ 中 static 的用法全局变量与局部变量
        • C++ static、const 和 static const 类型成员变量声明以及初始化
        1. 类静态数据成员在编译时创建并初始化:在该类的任何对象建立之前就存在,不属于任何对象,而非静态类成员变量则是属于对象所有的。类静态数据成员只有一个拷贝,为所有此类的对象所共享。
        2. 类静态成员函数属于整个类,不属于某个对象,由该类所有对象共享。
          1. static 成员变量实现了同类对象间信息共享。
          2. static 成员类外存储,求类大小,并不包含在内。
          3. static 成员是命名空间属于类的全局变量,存储在 data 区的rw段。
          4. static 成员只能类外初始化。
          5. 可以通过类名访问(无对象生成时亦可),也可以通过对象访问。
    • volatile
      • 综述:被该关键词修饰的变量,编译器将不对访问该变量的代码进行优化,以提供对特殊地址空间的稳定访问。
      • 举例
        int i=10;
        int j=i;
        int k=i;
        //i值未发生变化,编译器会优化掉,不会生成若干条访存指令,以提高效率
        volatile int i=10;
        int j=i;
        int k=i;
        //i值可能随时发生变化,系统总是重新从它所在的内存读取数据,然后操作
        
      • 作用
        • 阻止编译器为提高效率将一个变量放到寄存器而不写回内存
        • 组织编译器调整操作该关键字所修饰变量的指令顺序
      • 常见用途
        • 多任务环境下各任务间共享的标志
        • 中断服务程序中修改的供其它程序检测的变量
        • 存储器映射的硬件寄存器(状态寄存器)
    • const与#define
      const #define
      关键字 不是关键字,define也不是关键字
      编译器保留在符号表中 预编译期进行宏展开(宏替换)
      编译器会进行类型检查 无类型检查,简单的字符串替换
      在内存中一份拷贝 多份拷贝
      • const 修饰指针变量

      • C语言中const修饰的变量可间接修改(通过指针操作(GCC不行 Visual C++ 编译器可以)),C++中const修饰的结果是真正的常量,不可被修改;故C语言中case后的条件不能是const修饰的变量,而C++中可以是。

    • register
      • 寄存器变量通常储存在计算机内存中。如果幸运的话,寄存器变量储存在 CPU 的寄存器中,或者概括地说,储存在最快的可用内存中。与普通变量相比,访问和处理这些变量的速度更快。同时,该变量必须是能被CPU寄存器所接受的类型——一个单个的值(长度<=int)。由于寄存器变量储存在寄存器而非内存中,所以无法获取寄存器变量的地址(无法使用&)。
      • 对于上述“幸运”二字的理解:register 修饰的变量,只是对编译器的一种美好的请求(把我放到寄存器中吧),至于编译器是否照做,无从得知。
    • 内存 地址 指针
      • 内存溢出指申请的内存空间不足
      • 内存泄漏指申请内存空间后无法释放造成内存堆积
      • 缓冲区溢出指的是写入超过缓冲区能保存的最大数据量的数据
      • 忘记递归的结束条件会造成堆栈溢出
      • 防止缓冲区溢出的工作通常需要编译器完成
      • 段错误
      • 什么情况下导致内存泄漏(面试大华时,面试官给讲的)
        • 1
        • 2
        • 3
        • 4
        • 5
      • C语言程序运行时的内存分配
        • 栈 - 由编译器自动分配释放
        • 堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
        • 全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。- 程序结束释放
        • 另外还有一个专门放常量的地方。- 程序结束释放
        • 程序代码区,存放2进制代码。
        • 在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局区(静态区),在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用,在函数体内定义的static表示只在该函数体内有效。另外,函数中的"adgfdf"这样的字符串存放在常量区。
      • 一、堆栈空间分配区别:
        1、栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈;
        2、堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。
      • 二、堆栈缓存方式区别:
        1、栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放;
        2、堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。
      • 三、堆栈数据结构区别:
        堆(数据结构):堆可以被看成是一棵树,如:堆排序;
        栈(数据结构):一种先进后出的数据结构。
    • C语言字节对齐的规则,为什么要字节对齐?
    • 回调函数
      • 函数指针作为某个函数的参数
      • 函数指针变量可以作为某个函数的参数来使用的,回调函数就是一个通过函数指针调用的函数。
      • 简单讲:回调函数是由别人的函数执行时调用你实现的函数。
      • 以下是来自知乎作者常溪玲的解说:
      • 你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件。

    • 可重入函数?怎么实现的可重入?static关键字吗,它和可重入有什么关系
      可重入:允许被中断,返回后对函数控制无影响(多个任务调用该函数)
      不可重入:使用静态变量 全局变量 malloc() free() 标准I/O库函数
  • C++篇(对比C语言增强与扩充,C++我只是了解,考试勉强考个90,没咋用过)

    • 继承
      • 继承主要实现重用代码,节省开发时间。子类可以继承父类的一些东西。
    • 封装
      • 封装是实现面向对象程序设计的第一步,封装就是将数据或函数等集合在一个个的单元中(我们称之为类)。封装的意义在于保护或者防止代码(数据)被我们无意中破坏。
    • 多态(静态多态和动态多态,虚函数表和虚函数指针)
      • 多态是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态。
      • 静态多态(联编发生在编译阶段):函数重载、运算符重载、模板
      • 动态多态(联编发生在运行阶段):虚函数
    • 虚函数
    • 智能指针
    • STL
    • 析构函数为什么要用virtual修饰?
    • 不想让别的对象访问本类,应该怎么做?然后自己怎么访问的?(答:将构造函数设置成private,然后将定义一个static 函数用来访问私有的构造函数)
    • 基类、派生类调用构造函数、析构函数的顺序,以及一些访问权限问题。
    • 为什么有malloc还要有new
      1. malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
      2. 对于非内部数据类型的对象而言,光用malloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。
      3. 由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
      4. C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。
      5. new可以认为是malloc加构造函数的执行。new出来的指针是直接带类型信息的。而malloc返回的都是void指针。

操作系统/Linux/ucos-ii篇

  • 进程线程协程
  • 有几种锁 为什么要加锁
  • 操作系统堆和栈 堆和栈的区别,变量放在哪等等
  • 进程间通信方式 进程通信,线程同步(说了同步和通信方式后说了生产者消费者)
  • Linux父进程在fork一个子进程时如下哪些行为在系统层不会发生:()
    正确答案: D 你的答案: 空 (错误)
    生成一个新的PID
    复制父进程的数据
    执行子进程函数
    父进程等待子进程终止后退出
  • Linux系统调用的过程,中间发生了什么?
  • Linux中断的过程,下半部机制
  • 如果要设计一个操作系统实现多线程,你会需要几个模块?
  • 自旋锁和互斥锁的区别,在中断中使用自旋锁要怎么避免死锁。
  • 死锁
    • 必要条件
      • 互斥条件:一个资源每次只能被一个线程使用。
      • 请求与保持条件:一个线程因请求资源而阻塞时,对已获得的资源保持不放。
      • 不剥夺条件:线程已获得的资源,在未使用完之前,不能强行剥夺。
      • 循环等待条件:若干线程之间形成一种头尾相接的循环等待资源关系。
    • 预防死锁
      • 破坏“不可剥夺”条件:一个进程不能获得所需要的全部资源时便处于等待状态,等待期间他占有的资源将被隐式的释放重新加入到 系统的资源列表中,可以被其他的进程使用,而等待的进程只有重新获得自己原有的资源以及新申请的资源才可以重新启动,执行。
      • 破坏”请求与保持条件“:第一种方法静态分配即每个进程在开始执行时就申请他所需要的全部资源。第二种是动态分配即每个进程在申请所需要的资源时他本身不占用系统资源。
      • 破坏“循环等待”条件:采用资源有序分配其基本思想是将系统中的所有资源顺序编号,将紧缺的,稀少的采用较大的编号,在申请资源时必须按照编号的顺序进行,一个进程只有获得较小编号的进程才能申请较大编号的进程。
    • 避免死锁——银行家算法

计算机网络/TCP/IP/UDP/HTTP协议篇

  • TCP UDP区别
    • UDP,在传送数据前不需要先建立连接,远地的主机在收到UDP报文后也不需要给出任何确认。虽然UDP不提供可靠交付,但是正是因为这样,省去和很多的开销,使得它的速度比较快,比如一些对实时性要求较高的服务,就常常使用的是UDP。对应的应用层的协议主要有 DNS,TFTP,DHCP,SNMP,NFS 等。
    • TCP,提供面向连接的服务,在传送数据之前必须先建立连接,数据传送完成后要释放连接。因此TCP是一种可靠的的运输服务,但是正因为这样,不可避免的增加了许多的开销,比如确认,流量控制等。对应的应用层的协议主要有 SMTP,TELNET,HTTP,FTP 等。
  • 三次握手和四次分手
  • TCP/IP协议各层的校验方式
  • 访问网址经历的过程
  • 网络层,可以实现两个主机之间的通信。但是这并不具体,因为,真正进行通信的实体是在主机中的进程,是一个主机中的一个进程与另外一个主机中的一个进程在交换数据。IP协议虽然能把数据报文送到目的主机,但是并没有交付给主机的具体应用进程。而端到端的通信才应该是应用进程之间的通信。

数据结构与算法篇

  • 查找算法
  • 排序算法
    • 不稳定的排序方法:快 些 选 堆(快速排序,希尔排序,选择排序,堆排序)
  • 时间复杂度
  • 线性表
  • 队列
    • 先序,中序,后序三种应该都归为深度优先遍历算法,只有层次遍历才算广度优先遍历算法
  • 字符串

数据库/MySQL篇

  • 事务的概念可以描述为具有以下四个关键属性说成是 ACID:
    • 原子性(Atomicity):事务应该当作一个单独单元的操作,这意味着整个序列操作要么是成功,要么是失败的。
    • 一致性(consistency):这表示数据库的引用完整性的一致性,表中唯一的主键等。
    • 隔离性(Isolation):可能同时处理很多有相同的数据集的事务,每个事务应该与其他事务隔离,以防止数据损坏。
    • 持久性(Durability):一个事务一旦完成全部操作后,这个事务的结果必须是永久性的,不能因系统故障而从数据库中删除。

编译原理与计算机体系结构

  • 编译前端
  • 编译后端
  • Linux的gcc(四个过程以及每一步的指令)
  • 了解什么总线架构(个人感觉可能想问ARM总线架构)和通信协议(I²C、SPI那些)
  • DMA相关的问题
  • 大端与小端

手写代码篇

  • 1.查找、排序
    • C排序算法
    • 二分查找
    • 快速排序
  • 2.有序有重复数组最后一个出现的数。
  • 3.最大公共子序列。
  • 4.删除链表倒数第k个节点
  • 5.两个特别特别大的文件,里面存都是数字,找到在两个文件中都存在的数字。如何解决,给出尽量优的算法
  • 6.写一个二叉树的后序遍历,递归,非递归。
  • 7.给一个数组,输出最长的连续数字子串。(一直优化)
  • 8.栈逆序递归
  • 9.长度为100数组成员取值范围为0-99的数组中只有两个成员是一样的,如何快速找出
    链表的插入与删除的题目。

求n个数中最小的k个数,n是海量数据

  1. 程序题1:实现一个字符串拷贝函数,需考虑目的地址与源地址有可能重合的情况. 时间:10分钟

  2. 程序题二:打印回环数字矩阵,输入参数为边长n,例如n=4,求如下的回环矩阵:

1 2 3 4

12 13 14 5

11 16 15 6

10 9 8 7


你可能感兴趣的:(天刃-腾蛟起凤)