校园招聘攻略----嵌入式软件工程师基础问题(二)

问题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定义的只读变量在程序运行过程中只有一份备份

希望本文对大家有帮助,上文若有不妥之处,欢迎指正

分享决定高度,学习拉开差距

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鲁棒最小二乘支持向量机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值