找回密码
 立即注册
Qt开源社区 门户 查看内容

嵌入式笔面试题精选(1)

2019-9-23 06:42| 发布者: admin| 查看: 613| 评论: 0

摘要: 我们今天来点轻松的话题,一直讲内核可能受众有点少。眼下正值毕业生秋招,我们就来聊聊笔试面试那些题。1、嵌入式系统中经常要用到无限循环,你能用C编写多少种死循环呢?这个问题有几个解决方案。我首选的方案是: ...
  我们今天来点轻松的话题,一直讲内核可能受众有点少。眼下正值毕业生秋招,我们就来聊聊笔试面试那些题。

1、嵌入式系统中经常要用到无限循环,你能用C编写多少种死循环呢?

这个问题有几个解决方案。我首选的方案是:

while(1){

}

一些程序员更喜欢如下方案:

for(;;){

}

第三个方案是用goto

Loop:

        ...

    goto Loop;

第三种比较难想到。

2、写一个简单的程序判断系统的大小端

小端:低位字节数据存储在低地址

大端:高位字节数据存储在低地址

例如:int a=0x12345678;(假设a首地址为0x2000)

地址: 0x2000  0x2001  0x2002  0x2003

值 :  0x12   0x34    0x56   0x78    

这就是大端格式。

基于以上特点,我们不难写出判断程序:



上面的程序巧妙的利用了联合体共用地址空间的特点,如果是大端01会被存放在高地处,那么b就不会等于1。

3、指针的指针

下面这段程序会怎样?

void GetMemory(char *p)

{

p = (char *)malloc(100);

}

void Test(void)

{

char *str = NULL;

GetMemory(str);

strcpy(str, "hello world");

printf(str);

}

答案当然是段错误,试图通过修改指针str的值,只能传递str的地址。

4、tcp的三次握手和四次断开

对于学生,面试官最喜欢问的就是这个问题。

(1)第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SEND状态,等待服务器B确认。

(2)第二次握手:服务器B收到SYN包,必须确认客户A的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV状态。

(3)第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=k+1),此包发送完毕,客户端A和服务器B进入ESTABLISHED状态,完成三次握手。



(1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。

(2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。

(3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A。

(4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。



为何断开要四次自行思考。

5、写一个标准宏MIN,输入两个参数返回较小的一个

#define MIN(a,b)((a)>=(b)?(b):(a))

此题考查的是问号表达式和宏的展开问题,该有的括号不能省。

6、指针汇总

a) 一个整型数(An integer)

b) 一个指向整型数的指针(A pointer to an integer)

c) 一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a pointer to an integer)

d) 一个有10个整型数的数组(An array of 10 integers)

e) 一个有10个指针的数组,该指针是指向一个整型数的(An array of 10 pointers to integers)

f) 一个指向有10个整型数数组的指针(A pointer to an array of 10 integers)

g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an integer)

h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( An array of ten pointers to functions that take an integer argument and return an integer )

答案是:

a) int a; // An integer

b) int *a; // A pointer to an integer

c) int **a; // A pointer to a pointer to an integer

d) int a[10]; // An array of 10 integers

e) int *a[10]; // An array of 10 pointers to integers

f) int (*a)[10]; // A pointer to an array of 10 integers

g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer

h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer

最后一个可能比较有难度,即使看过一时也会想不起来。

7、交换两个变量的值,不使用第三个变量。即a=3,b=5,交换之后a=5,b=3;

有两种解法, 一种用算术, 一种用^(异或)

 a = a + b; b = a - b; a = a - b;

或者:

a = a^b;

b = a^b;

a = a^b;

8、用两个栈实现一个队列的功能。

这个我以前面试一家叫CVTE的广州的公司的时候,面试官就问了我这个问题。

栈是先入后出,队列是先进先出。

设2个栈为A,B, 一开始均为空。

入队: 将新元素push入栈A;

出队:

 (1)判断栈B是否为空,如果为空则执行第三步(最开始肯定是空的);

(2)如果不为空,则将栈A中所有元素依次pop出并push到栈B(这个操作就将先入后出的顺序颠倒成了符合要求的先进先出)

 (3)将栈B的栈顶元素pop出

这样实现的队列入队和出队的平摊复杂度都还是O(1),

9、25匹马,每次比赛5匹,问比赛多少次能够决出前3名。

  每5匹马一组,比赛5次,每组的第一名中肯定有25匹的第一名。所以让这五匹马再跑一次,第一名的肯定就是第一名。第四名和第五名的那两组全部马都不要,因为他们的第一名都不能挤进前三,剩下的肯定也没有机会的了。

  接下来有资格竞争第二名和第三名的马如下:

第一组的第二名,第三名

第二名那组的第一名,第二名

第三名那组的第一名(注意,第三名那组的第二名不可能进前三)。

刚好五匹马,让他们再跑一次,前两名就是第二和第三。

所以总共要跑5+1+1=7次

10、假定你有无限多的水,和一个5升的容器,一个3升的容器,请准确地倒出4升水。

  答案:首先将5升的容器装满水,然后倒满那个3升容器,这样5升的容器里面就剩下了2升水;然后将3升的容器里的水倒掉,将5升容器里面剩余的2升水倒进去;最后再将这个5升的容器打满水,然后再用这个5升的容器将3升容器倒满。因为这个3升容器里面已经有2升水了,所以倒进去的这些肯定是1升水,那么最后5升容器里面剩下的就是题目所要求的4水了!


----------------------------------------------------------------------------------------------------------------------
我们尊重原创,也注重分享,文章来源于微信公众号:嵌入式开发者,建议关注公众号查看原文。如若侵权请联系qter@qter.org。
----------------------------------------------------------------------------------------------------------------------

鲜花

握手

雷人

路过

鸡蛋

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了