校园招聘攻略----嵌入式软件工程师基础问题
Posted 鲁棒最小二乘支持向量机
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了校园招聘攻略----嵌入式软件工程师基础问题相关的知识,希望对你有一定的参考价值。
问题11
面试官:
简述TCP三次握手的过程?
学生:
- 第一次握手:
客户端创建传输控制块
,然后向服务器发出连接请求报文(将标志位SYN置1,随机产生一个序列号seq=x),接着进入SYN-SENT状态 - 第二次握手:服务器收到请求报文后由SYN=1得到客户端请求建立连接,
回复一个确认报文
(将标志位SYN和ACK都置1,ack=x+1,随机产生一个序列号seq=y),接着进入SYN-RCVD状态。此时操作系统为该TCP连接分配TCP缓存和变量 - 第三次握手:客户端收到确认报文后,检查ack是否为x+1,ACK是否为1,是则发送确认报文(将标志位ACK置1,ack=y+1,序列号seq=x+1),此时操作系统为该TCP连接分配TCP缓存和变量。
服务器收到确认报文并检查无误后则连接建立成功
,两者都进入ESTABLISHED状态,完成三次握手
问题12
面试官:
简述TCP四次挥手的过程?
学生:
- 第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态
- 第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态
- 第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态
- 第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手
问题13
面试官:
为什么TCP建立连接是三次握手,而关闭连接却是四次挥手?
学生:
- 建立连接的时候,服务器在LISTEN状态下,
不需要等待
,可以立即建立连接,把ACK和SYN放在一个报文里发送给客户端,因此只需要三次握手 - 关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了,但是
还能接受数据
,而自己未必将所有数据都发送完了,所以服务器可以立即关闭,也可以发送一些数据后再关闭,所以服务器的确认报文(ACK=1)和连接释放报文(FIN=1,ACK=1)一般分开发送,因此形成四次挥手
问题14
面试官:
数组与指针的区别?
学生:
- 定义:数组是类型相同、数目固定的若干个变量的有限集合,它
存放的是数据
。指针是变量的地址,存放的是变量的地址
- 存储方式:数组通常存储在
静态存储区或栈上
。指针可以随时随地地指向任意类型的内存块
- 内存容量:用运算符sizeof可以计算出数组的容量(字节数)。sizeof( p),p为指针得到的是一个指针变量的字节数,而不是p指的内存容量
- 补充:
数组长度 = sizeof(数组名)/sizeof(数组名[0])
;在32位操作系统下,指针是占4个字节空间大小,不管是什么数据类型;在64位操作系统下,指针是占8个字节空间大小,不管是什么数据类型
问题15
面试官:
什么是空指针和野指针?
学生:
- 空指针,
指向对象为空的指针
。即就是给指针初始化或赋值NULL(NULL所对应的ASCII码就是0),那么该指针就被称为空指针 - 野指针,
指针指向的位置是不可知的、随机的、没有明确限制的
。产生野指针的情况:1、指针未初始化;2、指针越界访问;3、指针指向的空间释放
问题16
面试官:
内存溢出和内存泄露是什么?
学生:
- 内存溢出,程序申请内存时,
没有足够的内存
供申请者使用 - 内存泄露,程序中间动态分配了内存,但是程序结束时没有释放该内存,
造成那部分内存不可用
- 内存泄露如何产生,一种情况如在C/C++ 语言中的,在堆中的分配的内存,在
没有将其释放掉
的时候,就将所有能访问这块内存的方式都删掉(如指针重新赋值);另一种情况则是在内存对象明明已经不需要的时候,还仍然保留着这块内存和它的访问方式(引用)
问题17
面试官:
链表与数组的区别?
学生:
- 内存上:
数组是连续内存
,因为是静态分配,所以不可以扩容。链表是非连续内存
,动态分配,没有顺序,通过链表中的next指针保存逻辑顺序 - 时间复杂度:查找,数组使用下标定位,1次就可以找到,O(1);链表需要循环查找,最大需要N次,O(N)。插入,数组插入删除需要移动其他元素,复杂度O(N);链表插入删除不需要移动其他元素,复杂度O(1)
问题18
面试官:
堆与栈的区别?
学生:
- 1、栈内存存储的是
局部变量
,堆内存存储的是实体
- 2、栈内存的
更新速度
要快于堆内存,因为局部变量的生命周期很短 - 3、栈内存存放的变量生命周期一旦结束就会被释放,堆内存存放的实体会被垃圾回收机制不定时的回收
问题19
面试官:
关键字Static的作用?
学生:
- 1、static
修饰局部变量
时,改变了变量的生命周期,让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束,但是作用域不变,仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束 - 2、static
修饰全局变量
时,这个全局变量只能在本源文件内使用,不能在其他源文件内使用 - 3、static
修饰函数
,该函数只在本文件内被调用或访问,不能跨文件访问,其他文件中可以定义相同名字的函数,不会发生冲突
问题20
面试官:
用define与用const修饰的常量有什么区别?
学生:
起作用的阶段
:#define是在编译的预处理阶段起作用,而const是在编译、运行的时候起作用起作用的方式
:#define只是简单的字符串替换,没有类型检查。而const有对应的数据类型,是要进行判断的,可以避免一些低级的错误存储方式
:#define只是进行展开,有多少地方使用,就替换多少次,它定义的宏常量在内存中有若干个备份;const定义的只读变量在程序运行过程中只有一份备份
希望本文对大家有帮助,上文若有不妥之处,欢迎指正
分享决定高度,学习拉开差距
以上是关于校园招聘攻略----嵌入式软件工程师基础问题的主要内容,如果未能解决你的问题,请参考以下文章