关键词不能为空

当前您在: 主页 > 英语 >

华为嵌入式面试题

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-03-03 12:42
tags:

-

2021年3月3日发(作者:欣喜若狂)


华为嵌入式系统面试题



1

)什么是预编译,何时需要预编译:




答案:




1、总是使用不经常改动的大型代码体。




2、


程序由多个模块组成,


所有模块都使用一组标准的包含文件和相同的编译选


项。在这种情况下, 可以将所有包含文件预编译为一个预编译头。





2



char * const p







char const * p







const char *p


上述三个有什么区


别?




答案:




char * const p; //


常量指针,

< p>
p


的值不可以修改




char const * p



//


指向常量的指针,指向的常量值不可以改



const char *p




//



char const *p




3



char str1[] =


=


*str8 =


< < ( str5 == str6 ) < < endl; cout < < ( str7 == str8 ) < < endl;




结果是:


0


0


1


1


str1,str2,str 3,str4


是数组变量,它们有各自的内存空间;而


str5 ,str6,str7,str8


是指针,它们指向相同的常量区域。

< br>




4


)以下代码中的两个


sizeof


用法有问题吗?

< p>



[C



]


void


UpperCase(


char


str[]


)


//




str


中的小写字母转换成大写字母



{





for(


size_t


i=0;


i



++i


)









if(


'a'


<=str[i]


&&


str[i] <='z' )













str[i] -= ('a'-'A' ); } char str[] =


字符


长度为


:


< < str < <


endl;


答案:函数内的


sizeof


有问题。根据语法,

< p>
sizeof


如用于数组,只能测出静


态数组的大 小,无法检测动态分配的或外部数组大小。


函数外的


str


是一个静态


定义的数组,因此其大小为


6< /p>


,因为还有


'0'


,函数内的

< p>
str


实际只是一个指向字


符串的指针,


没有任何额外的与数组相关的信息,


因此


siz eof


作用于上只将其当


指针看,一个指针为

< br>4


个字节,因此返回


4






5

< p>
)一个


32


位的机器


,< /p>


该机器的指针是多少位答案:




指针是多少位只要看地址总线的位数就行了。


80386


以后的机子都是


32



数据 总线。所以指针的位数就是


4


个字节了。




6



main()


{



int


a[5]={1,2,3,4,5};





int


*ptr=(int


*)(&a+1);





pri ntf(


答案:


2


< br>5 *(a+1


)就是


a[1]



*(ptr-1)


就是


a[4],< /p>


执行结果是


2



5 &a+1


不是首地址


+1



系统会认为加一个


a


数组的偏移,

< p>
是偏移


了一个数组的大小


(本例是


5



int




int *ptr=(int *)(&a+1);



ptr


实际是


&(a[5]),< /p>


也就是


a+5


原因如下:



&a


是数组指针,其类型为



int


(*)[5];


而指针加< /p>


1


要根


据指针类型加上一定的值,不同类 型的指针


+1


之后增加的大小不同


< /p>


a


是长度为


5



int


数组指针,


所以要加

< p>


5*sizeof(int)


所以

< p>
ptr


实际是


a[5]


但是


prt



(&a+1)

< p>
类型是不一样的


(


这点很重要

)


所以


prt-1


只会减去


sizeof(int*) a,&a


的地址是一样


的,但意思不一样,


a


是数组首地址,也就是


a[0]


的地址,


&a


是对象(数组)首


地址



a+1


是数组下一元素的地址,即


a[1],&a+1


是下一个对象的地址,即


a[5].



7


、请问以下代码有什么问题:




int



main()



{



char a;



char *str=&a;



strcpy(str,



printf(str);


return 0;



}


答案:没有为

< br>str


分配内存空间,将会发生异常。问题出在将一个字符串复制


进一个字符变量指针所指地址。


虽然可以正确输出结果,


但因为越界进行内在读


写而导致程序崩溃。




8



char* s=


有什么错?



答案:



是字符串常量。


s


是指针, 指向这个字符串常量,所以声明


s


的时候就有问题。

< p>


cosnt char* s=


然后又因为是常 量,


所以对是


s[0]


的赋

< p>
值操作是不合法的。




9


、写一个“标准”宏,这个宏输入两个参数并返回较小的一个。



答案:


.#define Min(X, Y) ((X)>(Y)?(Y):(X))



//


结尾没有‘;





10


、嵌入式系统中经常要用到无限循环,你怎么用

C


编写死循环。



答案:


while(1){}


或者


for(;;)



11


、关键字


static


的作用是什么?



答案:定义静态变量




12


、关键字


const


有 什么含意?



答案:表示常量不可以修改的变量。




13


、关键字


volatile


有什么含意?并举出三个不同的例子?



答案 :提示编译器对象的值可能在编译器未监测到的情况下改变。




14



int (*s[10])(int)


表示的是什么啊?



答案:


int (*s[10])(int)


函数指针数组,每个指针指向一个


int func(int param)


的函数。




15


。有以下表达式:




int a=248;



b=4;


int const c=21;


const int *d=&a;



int *const e=&b;


int const *f const =&a;



请问下列表达式哪些会被编译器禁止?为什么?



答案:


*c=32;d=&b;*d=43;e=34;e=&a;f=0x 321f; *c


这是个什么东东,禁止



*d



了是


const




禁止



e = &a


说了是


const


禁止



const *f const =&a;


禁止



< br>16


交换两个变量的值,不使用第三个变量。即


a=3, b=5,


交换之后


a=5,b=3;



答案:


有两种解法


,


一种用算术算法


,


一种用

< p>
^(


异或


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


- b; or a = a^b;//


只能对


int,char.. b = a^b; a = a^b; or a ^= b ^= a;



17.c



c++


中的


st ruct


有什么不同?



答案:


c



c++



struct


的主要区别是


c


中的


struct


不可以含有成员函数,



c++


中的


struct


可以。


c++



struct



class


的主要区 别在于默认的存取权限不同,


struct


默认为


public


,而


class


默认为


private



18.


#include




#include




void getmemory(char *p)




{






p=(char *) malloc(100);






strcpy(p,




}




int main( )




{






char *str=NULL;






getmemory(str);






printf(






free(str);






return 0;






}


答案 :程序崩溃,


getmemory


中的


malloc


不能返回动态内存,



free


()对


str


操作很危险




19.


char szstr[10];




strcpy(szstr,



产生什么结果?为什么?



答案:




长度不一样,会造成非法的


OS


< /p>


20.


列举几种进程的同步机制,并比较其优缺点。



答案:




原子操作



信号量机制






自旋锁






管程,会合,分布式系统




21.


进程之间通信的途径



答案:共享存储系统消息传递系统管道:以文件系统为基础




22.


进程死锁的原因



答案:资源竞争及进程推进顺序非法




23.


死锁的


4


个必要条件



答案:互斥、请求保持、不可剥夺、环路




24.


死锁的处理



答案:鸵鸟策略、预防策略、避免策略、检测与解除死锁




25.



操作系统中进程调度策略有哪几种?



答案:


FCFS(


先来先服务


)


,优先级,时间片轮转


,多级反馈




26.


类的静态成员和非静态成员有 何区别?



答案:类的静态成员每个类只有一个,非静态成员每个对象一个




27.


纯虚函数如何定义?使用时应 注意什么?



答案:


virtual void f()=0;


是接口,子类必须要实现




28.


数组和链表的区别



答案:


数组:数据顺序存储,固定大小




链表:数据可以随机存储,大小可


动 态改变





的 七层模型是什么?


tcp/udp


是属于哪一层?


tcp/udp


有何优缺点?


答案:


应用层表示层会话层运输层网络层物理链路层物理层



tcp /udp


属于运


输层



TCP


服务提供了数据流传输、可靠性、有效流控制、全双工 操作和多路复


用技术等。与



TCP


不同,



UDP


并不提供对



IP

< br>协议的可靠机制、流控制以及


错误恢复功能等。由于



UDP


比较简单,



UDP


头包含很少的字节,比



TCP



载消耗少。



tcp:


提供稳定的传输服务,有流量控制,缺点是包头大, 冗余性不




udp:


不提供稳定的服务,包头小,开销小





30



(void *)ptr




(*(void**))ptr< /p>


的结果是否相同?其中


ptr


为同一个指 针



答案:


.(void *)ptr




(*(void**))ptr< /p>


值是相同的




31




int main()






{






int x=3;






printf(






return 1;








}


问函数既然不会被其它函数调用,为什么要返回

< p>
1




答案:

< p>
mian


中,


c


标准认为


0


表示成功,非


0

表示错误。具体的值是某中具


体出错信息




32



要对 绝对地址


0x100000


赋值,


我们 可以用



(unsigned int*)0x100000 = 1234;


那么要是想让程序跳转到绝对地址是


0x10 0000


去执行,应该怎么做?



答案:


*((void (*)( ))0x100000 ) ( );


首先要将


0x100000


强制转换成函数指针


,



: (void (*)())0x100000


然后再调用它


: *((void (*)())0x100000)();



typedef


可以


看得更直观些


: typedef void(*)() voidFuncPtr; *((voidFuncPtr)0x100000)();



33



已知一个数组


table



用一个宏定义,


求出数据的元素个数答案 :


#define NTBL


#define NTBL (sizeof(table)/sizeof(table[0]))



34


、线程与进程的区别和联系


?


线程是否具有相同的堆栈


?


dll< /p>


是否有独立的堆



?



答案:


进程是死的,


只是一些资源的集合,


真正的程序执行都是线程来完成


的,


程序启动的时候操作系统就帮你创建了一个主线程。每个线程有自己的堆

< p>




DLL

< p>
中有没有独立的堆栈,这个问题不好回答,或者说这个问题本身是


否有问题 。因为


DLL


中的代码是被某些线程所执行,只有线程拥有堆栈 ,如



DLL


中的代码是


EXE


中的线程所调用,那么这个时候是不是说这个


DLL


没有自己独立的堆栈?如果


DLL


中的代码是由


DLL


自己创建的线程所执行,


那么是不是说


DLL


有独立的堆栈?以上讲的是堆栈, 如果对于堆来说,每个


DLL


有自己的堆,所以如果是从


DLL


中动态分配的内存,最好是从


DLL< /p>


中删


除,如果你从


DLL


中分配内存,然后在


EXE


中,或者另外一个


DLL


中删除,


很有可能导致程序崩溃




35




unsigned short A = 10;



printf(



char c=128;



printf(



输出多少?并分析过程



答案:第一题,~


A



0xfffffff5,int




为-


11


,但输出的是


uin t


。所以输出


4294967285


第二题,


c



0x10,


输出的是


int


,最高位为


1


,是负数,所以它的值


就是


0x00


的补码就是


128


,所以输出-


128


。这两道题都是在考察二进制向


int



uint


转换时的最高位处理。







(二)



1. -1,2,7,28,,126


请问

28



126


中间那个数是什么? 为什么?



答案:第一题的答案应该是


4^3-1=63


规律是


n^3-1(



n


为偶数


0



2



4)







n^3 +1(



n


为奇数

1



3



5)



2.


用两个栈实现一个队列的 功能?要求给出算法和思路!



答案:



2


个栈为


A,B,


一开始均为空


.


入队


:


将新元素

push


入栈


A;


出队


: (1)


判断栈


B


是否为空;



(2)


如果不为空,则将栈


A


中所有元素依次


pop


出并


push


到栈


B




( 3)


将栈


B


的栈顶元素


pop


出;这样实现的队列入队和出队的平摊复杂


度都 还是


O(1),


比上面的几种方法要好。




3.



c


语言库函数中 将一个字符转换成整型的函数是


atol()


吗,这个函数的原 型


是什么?



答案:函数名


: atol





:


把字符串转换成长整型数






: long atol(const


char *nptr);


程序例


: #include #include int main(void) { long l;


char


*str


=



l


=


atol(lstr);


printf(


=


%s


integer


=


%ldn


str,


l);


return(0); }



4


。对于一个频繁使用的短小函数


,



C


语言中应用什么实现


,


C++


中应用什么


实现


?



答案:


c


用宏定义,


c++



inline



5


。直接链接两个信 令点的一组链路称作什么


?



答案:


PPP


点到点连接




7


。软件测试都有那些种类


?



答案:黑盒:针对系统功能的测试






白合:测试函数功能,各函数接口




8


。确定模块的功能和模块的接口是在软件设计的那个队段完成 的


?



答案:概要设计阶段




9



enum string





{





x1,





x2,





x3=10,





x4,





x5,





}x;






x



答案:取值在


0



1



10



1 1



12


中的一个



10




unsigned char *p1;






unsigned long *p2;






p1=(unsigned char *)0x801000;






p2=(unsigned long *)0x810000;






请问


p1+5=



;









p2+5=



;



答案:


801005




810014


。不要忘记 了这个是


16


进制的数字,


p2


要加


20




16


进制就是


14



选择题


:




net





Internet









?



;;;;




2.


属于网络层协议的是


:



;;;D.X.25




s


消息调度机制是


:



A.


指令队列


;B.


指令堆栈


;C.


消息队列


;D.


消息堆栈


;


答案:


b



a



c




.


找错题


:


1.


请问下面程序有什么错误


?






int a[60][250][1000],i,j,k;






for(k=0;k <=1000;k++)






for(j=0;j <250;j++)








for(i=0;i <60;i++)








a[i][j][k]=0;



答案:把循环语句内外换一下




2


。以下是求一个数的平方的程序< /p>


,


请找出错误


:






#define SQUARE(a)



((a)*(a))






int a=5;






int b;






b=SQUARE(a++);



答案:这个没有问题,


s

< p>


a


++)


,就是(



a


++)×(


a


++)


)唯一要注意的


就是计算后


a



7





3




typedef unsigned char BYTE








int examply_fun(BYTE gt_len; BYTE *gt_code)








{










BYTE *gt_buf;








gt_buf=(BYTE


*)MALLOC(Max_GT_Length);







......







if(gt_len>Max_GT_Length)










{










return GT_Length_ERROR;












}










.......








}



答案:要释放内存问答题


: Phone


的原理是什么


?


答案:


IPV6 /IP


通信


建立的过程怎样,


端口有什么作用?答案:


三次 握手,


确定是哪个应用程序使用


该协议




(三)



1


、局部变量能否和全局变量重名?



答案:能,局部会屏蔽全局。要用全局变量,需要使用



局部变量可以与


全局变量同名,


在函数内引用这 个变量时,


会用到同名的局部变量,


而不会用到


全局变量。


对于有些编译器而言,


在同一个函数内可以 定义多个同名的局部变量,


比如在两个循环体内都定义一个同名的局部变量,

< p>
而那个局部变量的作用域就在


那个循环体内




2


、如何引用一个已经定义过的全局 变量?



答案:


extern


可以用引用头文件的方式,也可以用


extern

关键字,如果用引


用头文件方式来引用某个在头文件中声明的全局变理,假定你将那 个变写错了,


那么在编译期间会报错,如果你用


extern< /p>


方式引用时,假定你犯了同样的错误,


那么在编译期间不会报错, 而在连接期间报错




3


、全局变量可不可以定义在可被多个


.C


文件包含的 头文件中?为什么?



答案:可以,在不同的

< br>C


文件中以


static


形式来 声明同名全局变量。可以在


不同的


C


文 件中声明同名的全局变量,前提是其中只能有一个


C


文件中对此 变


量赋初值,此时连接不会出错




4


、语句


for(



1



)< /p>


有什么问题?它是什么意思?



答案:和


while(1)


相同。




5



do< /p>


……


while



while


……


do


有什么区别?< /p>



答案:前一个循环一遍再判断,后一个判断以后再循环。




6


、请写出下列代码的输出内容




include



main()



{



int a,b,c,d;



a=10; b=a++;



c=++a;



d=10*a++;



printf(


< br>c



d



%d



%d



%d



b



c



d



;



return 0;



}




案< /p>



10



12< /p>



120



a=10;



b=a++;//a=11


b=10



c=++a;//a=12


c=12



d=10*a++;//a=13 d=120





高级题



1



static

全局变量与普通的全局变量有什么区别?


static


局部 变量和普通局部变


量有什么区别?


static


函数与普通函数有什么区别?



答案:全局变量


(


外部变量


)


的说明 之前再冠以


static


就构成了静态的全局变


量。


全局变量本身就是静态存储方式,


静态全局变量 当然也是静态存储方式。




两者在存 储方式上并无不同。


这两者的区别虽在于非静态全局变量的作用域是整

< br>个源程序,



当一个源程序由多个源文件组成时,非静态 的全局变量在各个源文


件中都是有效的。而静态全局变量则限制了其作用域,

< p>


即只在定义该变量的源


文件内有效,



在同一源程序的其它源文件中不能使用它。由于静态全局变量的


作用域局限于一个源文件内,


只能为该源文件内的函数公用,


因 此可以避免在其


它源文件中引起错误。从以上分析可以看出,



把局部变量改变为静态变量后是


改变了它的存储方式即改变了它 的生存期。


把全局变量改变为静态变量后是改变


了它的作用域, 限制了它的使用范围。



static


函数与普通函数作用域不同。仅在


本文件。只在当前源文件中使用的函数应该说明为内部 函数


(static)


,内部函数应


该 在当前源文件中说明和定义。


对于可在当前源文件以外使用的函数,

应该在一


个头文件中说明,


要使用这些函数的源文件要包含 这个头文件



static


全局变量与


普通的全局变量有什么区别:


static

全局变量只初使化一次,防止在其他文件单


元中被引用


;


static


局部变量和普通局部变量有什么区别:

< p>
static


局部变量只被初


始化一次,下一次依 据上一次结果值;



static


函数 与普通函数有什么区别:


static


函数在内存中只有一份, 普通函数在每个被调用中维持一份拷贝



2


、程序的局部变量存在于()中,全局变量存在于()中,动态申请数据存在


于(



)中。



答案:


栈;静态区;堆




3


、设有以下说明和定义:




typedef union {long i; int k[5];



char c;


} DATE;



struct data { int cat; DATE cow; double dog;} too;



DATE max;



则语句



printf(


的执行结果是:


______


< br>答案:


DATE


是一个


unio n,


变量公用空间


.


里面最大的变量类型是


int[5],


占用


20


个字节


.


所以它的大小是


20


data


是一个


struct,


每个变量分开占用空间


.


依次为


int4 + DATE20 + double8 = 32.


所以结果是



20 + 32 = 52.


当然


...


在某些


16


位编辑器下


, int

< br>可能是


2


字节


,


那么结果是



int2 + DATE10 + double8 = 20



4


、队列和栈有什么区别?



答案:队列先进先出,栈后进先出÷




6


、已知一个单向链表的头,请写出删除其某一个结点的算法, 要求,先找到此


结点,然后删除。



答案:


slnodetype


*Delete(slnodetype


*Head,int


key){}



if(Head->n umber==key)


{


Head=Pointer->next;


free(Pointer);


break;


}


Back


=


Pointer;









Pointer=Pointer->next;


if(Pointer->number==key)


{













Back->next=Pointer->next; free(Pointer); break; } void delete(Node*


p) {





if(Head = Node)





while(p) }



7



请找出 下面代码中的所以错误说明:


以下代码是把一个字符串倒序,




abcd



倒序后变为“


dcba





1


、#


in clude


2



main()


3



{


4




cha r*src=


5




char*


dest=NULL; 6




int len=strlen(src); 7




dest=(char*)malloc(len); 8




char* d=dest;


9




char* s=src[len]; 10




while(len--!=0) 11




d++=s--; 12




printf(




return


0;


14



}


答案:还要加上#


include



int


main(){


char*


src


=




//< /p>


要为


0


分配一个空间


char* d = dest; char* s = &src[len-1]; //


指向最后一个字符



while( len-- != 0 ) *d++=*s--; *d = 0; //


尾部要加


0 printf(


使用完,应当释放空间,以免造成内存汇泄露



return 0; }







华为笔 试题(


3





2006-09-29 19:41



一、判断题(对的写


T


,错的写


F< /p>


并说明原因,每小题


4


分,共

< p>
20


分)




1


、有数组定义


int a[2][2 ]={{1},{2,3}};



a[0][1]


的值为


0








正确






2



int (*ptr) (),



ptr


是一维 数组的名字。


(错误




int (*ptr) ();


定义一个指向函


数的指针变量









3


、指针在任何情况下都可进行


>, <,>=, <=,==


运算。





错误







4



switch(c)

< p>
语句中


c


可以是


int ,long,char ,


float


,unsigned int


类型。





错,


不能用实形






二、填 空题(共


30


分)




1




windows


下,


写出运行结果,


每空


2


分,



10


分。



char str[ ]=



Hello



;


char


*p=str;


int


n=10;


sizeof(str)=(







)


sizeof(p)=(







)


sizeof(n)=(







)


void func(char str[100]){





}


sizeof(str)=(





)




答案 :


6



4


,< /p>


4



4,


具体 解释请参看我的空间里的“


C/C++


程序员应聘试题


剖析”




2



void getmemory(char **p, int num) { *p=(char *) malloc(num);} void test(void)


{



char


*str=NULL;





getmemory(&str,100);





strcpy(str,



hello



);





printf(str); }


运行


test


函数有什么结果?(








10






答案:输出


hello


,但是发生内存泄漏。




3


、设


int arr[]={6,7,8,9,10};








int *ptr=arr;






*(ptr++)+=123;



-


-


-


-


-


-


-


-



本文更新与2021-03-03 12:42,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/699992.html

华为嵌入式面试题的相关文章