嵌入式软件工程师笔试题目Word文档格式.docx
《嵌入式软件工程师笔试题目Word文档格式.docx》由会员分享,可在线阅读,更多相关《嵌入式软件工程师笔试题目Word文档格式.docx(9页珍藏版)》请在冰豆网上搜索。
}
do
10.
11.
p1=
head->
next;
12.
p2=
next->
13.
}while(p2&
&
p2->
next&
p1
!
=p2);
14.
if(p1
==p2)
15.
16.
*start=p1;
17.
returntrue;
18.
19.
else
20.
21.}
3.计算一个无符号32位整型(unsignedint)的bit有多少位为1或0
1.intcaculate_bit(unsignedintnum)
2.{
3.
unsignedintmask=1<
<
31;
intn=0;
inti;
for(i=0;
i<
32;
i++)
if(num&
mask)
n++;
num<
=1;
returnn;
4.保证malloc和free成对出现
1.char*function(void)
3.char*p;
4.p=(char*)malloc(⋯);
5.if(p==NULL)
6.⋯;
7.⋯/*一系列针对p的操作*/
8.returnp;
9.}
在某处调用function(),用完function中动态申请的内存后将其free,如下:
char*q=function();
free(q);
上述代码明显是不合理的,因为违反了malloc和free成对出现的原则,即"
谁申请,就由谁释放"
原则。
不满足这个原则,会导致代码的耦合度增大,因为用户在调用function函数时
需要知道其内部细节!
正确的做法是在调用处申请内存,并传入function函数,如下:
char*p=malloc(⋯);
if(p==NULL)function(p);
free(p);
p=NULL;
而函数function则接收参数p,如下:
voidfunction(char*p)
⋯/*一系列针对p的操作*/
6.编写一个函数实现求两个整数的最大公约数
1.intfuc(inta,intb)
3.if(a%b==0)
4.returnb;
5.returnfuc(b,a%b);
6.}
7.将对称的二维数组逆转
1.#defineN3
2.inti,j,a[N][N]={1,2,3,4,5,6,7,8,9};
3.inttemp;
4.for(i=0;
N;
5.{
6.for(j=i;
j<
j++)
7.{
8.if(i==j)
9.continue;
temp=a[i][j];
a[i][j]=a[j][i];
a[j][i]=temp;
14.}
8.冒泡排序和选择排序和插入排序
1.#defineN5
2.//冒泡排序
3.for(i=0;
N-1;
5.for(j=0;
N-i-1;
6.{
7.if(a[j]>
a[j+1])
8.{
9.temp=a[j];
10.a[j]=a[j+1];
11.a[j+1]=temp;
12.}
13.}
14.}
15.//选择排序
16.for(i=0;
i++)
17.{
18.k=i;
19.for(j=k+1;
N;
20.{
21.if(a[k]>
a[j])
22.k=j;
23.}
24.temp=a[k];
25.a[k]=a[i];
26.a[i]=temp;
27.}
28.//插入排序
29.for(j=1;
30.{
31.key=a[j];
32.i=j-1;
33.while(i>
=0;
&
a[i]>
key)
34.{
35.a[i+1]=a[i];
36.i--;
37.}
38.a[i+1]=key;
39.}
9.字符串的链接函数(不能用系统自带的函数实现)[cpp]viewplaincopyprint?
1.voidstring_strcat(char*dest,char*src)
3.char*p=dest;
//记录头位置
4.while(*dest++);
5.dest--;
6.while(*dest++=*src++);
7.*dest=\'
0'
;
8.}
10.用#define声明一个常数,用以表明一年中有多少秒
365)UL
#defineSECONDS_PER_YEA(6R0*60*24
11.关键字volatile有什么含义
定义为volatile的变量可能会被意想不到的改变,这样编译器就不会去假设这个变量的值,准确的说,优化器在用到volatile变量时候必须小心地重新读取该变量的值,而不是使用保存在寄存器的备份,用到volatile的三个例子
【1】并行设备的硬件寄存器(如:
状态寄存器)。
【2】一个中断服务字程序中汇访问到的非自动变量。
【3】多线程应用中被几个任务共享的变量
12.多线程同步的方式
【1】临界区。
通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问
【2】互斥量。
为协同共同对一个共享资源的单独访问而设计的。
【3】信号量。
为控制一个具有有限数量用户资源而设计的。
P操作:
S减1;
若S减1后仍大于等于零,则进程继续执行;
若S减1后小于零,则进程
阻塞
V操作:
S加1;
若S加1后大于零,则进程继续执行;
若S减1后小于等于零,则从该信
号的等待队列中唤醒一个等待进程
【4】事件。
用来通知线程有一些事件已经发生,从开启动后继任务的开始。
13.函数指针问题
1.<
PREclass=cppname="
code"
>
/PRE>
//改错
1:
//改为(在C或C++中):
p=(char*)malloc(sizeof(
char)*num);
*p=(char*)malloc(sizeof(char)*num);
5.}
6.voidTest()
voidTest()
7.{
char*str=NULL;
GetMemory(str,100);
GetMemory(&
str,100);
strcpy(str,"
hello"
);
11.}
13.//或者改为(在C++中):
14.voidGetMemory(char*&
p,intnum)
15.{
16.p=(char*)malloc(sizeof(char)*num);
17.}
18.voidTest()
19.{
20.char*str=NULL;
21.strcpy(str,"
22.}
23.
24.
25.
26.
27.//改错2:
28.char*GetString(void)
29.{{
30.charp[]="
31.returnp;
32.}
33.voidTest()
34.{{
35.char*str=NULL;
//改为:
voidGetString(
p="
char*str=
36.
str=GetString();
char*&
p)//GetString(char**p)
//*p="
NULL;
GetString(str);
//GetString(&
str)
37.}<
38.<
P>
/P>
39.<
PRE>
40.<
41.<
42.<