C语言嵌入式开发面试问题汇总

一、计算机网络

1.网络体系结构分几层

d972d56a36364e2db8533962eb8ccb46.png

(1) OSI的七层协议模型

OSI七层协议分别是:应用层(Application)、表示层(Presentation)、会话层(Session)、运输层(Transport)、网络层(Network)、数据链路层(Data Link)、物理层(Physical)

(2)TCP/IP四层协议模型

TCP/IP四层协议分别为:应用层、传输层、网络层、链路层

(3)五层协议模型

五层协议模型分别是:应用层、传输层、网络层、数据链路层、物理层

 

2.TCP协议与UDP协议的区别

1、TCP是面向连接的,而UDP是面向无连接;

2、对系统资源的要求(TCP较多,UDP少);

3、UDP程序结构较简单;

4、TCP面向字节流模式与UDP是面向数据报模式 ;

5、TCP保证数据正确性,UDP可能丢包,TCP是可靠的传输;

6、TCP保证数据顺序,UDP不保证。

 

3.IP地址分类有哪些?

IP地址分为五大类:A类、B类、C类、D类、E类;前三类A、B、C类为Internet NIC在全球范围内统一分配,D、E类为特殊地址。

类别   最大网络数   IP地址范围   单个网段最大主机数   私有IP地址范围


A   126(2^7-2)   1.0.0.1-127.255.255.254   16777214   10.0.0.0-10.255.255.255


B   16384(2^14)   128.0.0.1-191.255.255.254   65534   172.16.0.0-172.31.255.255


C   2097152(2^21)   192.0.0.1-22   3.255.255.254   254   192.168.0.0-192.168.255.255

D类IP地址第一个字节以"1110"开始,它是专门保留的地址,又叫做多播地址,即组播地址。在以太网中,多播地址命名了一组应该在这个网络中应用接收到一个分组的站点。多播地址的最高位必须是“1110”,范围从224.0.0.0到239.255.255.255。

E类IP地址是以“1111”开始,他的第一字节的范围是240~255,为将来使用保留。其中240.0.0.0~255.255.255.254作为保留地址,255.255.255.255作为广播地址。

 

4.三次握手的过程

所谓三次握手,即建立TCP连接,语言客户端与服务器端发送三次包的过程来确认连接的建立。

54bd01808e2b47baa3b032fc173bd1cf.png

 (1)第一次握手,客户端Client将标志位SYN置1,seq序号随机产生一个数值J,将syn包发送给服务器端Server,进入SYN_SENT状态。

(2)第二次握手,服务器接收到客户端的SYN=1即知道客户端需要建立连接,将SYN和ACK都置为1,ack=J+1,seq序号随机产生K。然后打包发送给客户端,进入SYN_RCVD状态。

(3)第三次握手,客户端接收到服务器端的确认信息后,检查ack是否为J+1,ACK是否为1。如果正确,则将ACK置为1,ack置位K+1,打包发送给服务器端。服务器接收到后,确认ACK和ack正确后,服务器与客户端即建立连接。

 

二、数据结构

1.数据结构有哪些算法?

基本操作:栈,队列,链表,树。

排序算法:快速排序,堆排序,归并排序,简单排序(冒泡排序,插入排序,选择排序)

搜索算法:二分搜索算法(已排序),深度优先,广度有限。以及使用Hash表,剪枝进行优化。

基本算法的思想应该有:1、回溯2、递归3、贪心4、动态规划5、分治

 

2.快排怎样实现的(引用自“李小白~”)

void Quick_Sort(int *arr, int begin, int end){
    if(begin > end)
        return;
    int tmp = arr[begin];
    int i = begin;
    int j = end;
    while(i != j){
        while(arr[j] >= tmp && j > i)
            j--;
        while(arr[i] <= tmp && j > i)
            i++;
        if(j > i){
            int t = arr[i];
            arr[i] = arr[j];
            arr[j] = t;
        }
    }
    arr[begin] = arr[i];
    arr[i] = tmp;
    Quick_Sort(arr, begin, i-1);
    Quick_Sort(arr, i+1, end);
}

 

3.栈和队列的区别?

队列和栈是两种重要的线性结构,从数据结构看,也是操作受限的线性表。

队列是一种先进先出(FIFO)的的数据结构,只允许在一端进行插入操作,另一端进行删除操作。

具体应用:舞伴问题,银行排队模拟

栈是一种先进后出(FILO)的数据结构,只能在一端(栈顶)进行插入删除操作。

具体应用:递归,数值转换,四则运算表达式求值,括号匹配问题

 

三、C语言相关知识点

1.联合体与结构体区别

结构体struct:各成员各自拥有自己的内存,各自使用互不影响。结构体内遵循内存对齐原则,一个struct变量的总长度等于各成员长度之和。

联合体union:各成员共用一块内存空间,并且同时只有一个成员拥有使用权,也就是读写权,各变量共同拥有一个首地址。因而,联合体比结构体更节约内存。一个union变量的总长度至少能容纳最大的成员变量,而且要满足是所有成员变量类型大小的整数倍。

 

2.static定义的函数与普通函数差异

当使用static声明的函数,它的使用权限仅限于当前源文件当中,不能被除当前源文件以外的其他代码文件所调用。而普通函数默认是extern 的,可以被其他源文件所调用。

优点:其他源文件可以定义相同函数名的函数,而不会发生冲突。静态函数不会被其他源文件所调用。

 

3.动态地址如何实现?

C语言的地址分配可以使用malloc()实现,malloc会向堆中申请一块内存块,若申请成功则返回该块开头的指针,否则返回空指针NULL;因为返回值为void *,需要强制转换(int *)为我们需要的类型。如果申请的size大小为0,这是未定义的,可能为空也可能不为空,取决于编译器。

int *p = NULL;

 int n = 50;//此处n可以改成由用户输入任意数字

 p = (int *)malloc(sizeof(int)*n);

if(p == NULL)

return;

使用malloc申请的地址使用完之后需要进行释放,如果不手动释放则会在程序执行完之后才释放地址,可能会导致内存泄露,所以未使用的地址需要手动释放

free(p);

 

4.函数指针如何实现

函数指针:在程序中定义了一个函数,编译时则这个函数将会存放在一块连续的内存空间中,函数名指向了该空间的首地址,定义一个指针变量存放该地址即函数指针。

函数指针定义如下

函数返回值类型 (* 指针变量名) (函数参数列表);

如何使用函数指针调用函数?举例说明一下

int max(int, int);//声明函数

int (*p)(int,int);//定义函数指针

p = max;//将函数地址赋值给函数指针p

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

申时霁雨

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

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

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

打赏作者

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

抵扣说明:

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

余额充值