2020年华为精选50⾯试题及答案
华为linux系统下载2020年华为精选50⾯试题及答案
1.static有什么⽤途?(请⾄少说明两种)
1)在函数体,⼀个被声明为静态的变量在这⼀函数被调⽤过程中維持其值不变。
2)在模块内(但在函数体外),⼀个被声明为静态的变量可以被模块内所⽤函数访问,但不能被模块外其它函数访问。它是⼀个本地的全局变量。
3)在模块内,⼀个被声明为静态的函数只可被这⼀模块内的其它函数调⽤。那就是,这个函数被限制在声明它的模块的本地范围内使⽤
2.引⽤与指针有什么区别?
1)引⽤必须被初始化,指针不必。
2)引⽤初始化以后不能被改变,指针可以改变所指的对象。
3)不存在指向空值的引⽤,但是存在指向空值的指针。
3.描述实时系统的基本特性
在特定时间内完成特定的任务,实时性与可靠性。
4.全局变量和局部变量在内存中是否有区别?如果有,是什么区别?
全局变量储存在静态数据库,局部变量在堆栈。
5.什么是平衡⼆叉树?
左右⼦树都是平衡⼆叉树且左右⼦树的深度差值的绝对值不⼤于1。
6.堆栈溢岀⼀般是由什么原因导致的?
没有回收垃圾资源。
7.什么函数不能声明为虚函数?
constructor函数不能声明为虚函数。
8.冒泡排序算法的时间复杂度是什么?
时间复杂度是0 02)。
9.Internet⾤⽤哪种⽹络协议?该协议的主要层次结构?
Tcp/ip协议
主要层次结构为:应⽤层/传输层個络层/数据槌路层/物理层。
10.IP地址的编码分为哪俩部分?
IP地址由两部分组成,⽹络号和主机号。不过是要和“⼦⽹掩码”按位与上之后才能区分哪些是⽹络位哪些是主机位。
11.⽤户输⼊M,N值,从1⾄N开始顺序循环数数,每数到
M输出该数值,直⾄全部输出。写岀C程序。
循环链表,⽤取余操作做
12.某32位系统下,C++程序,请计算sizeof的值.
char str[] = rt http: //www. ibegroi5>. com/w
char *p = str ;
int n = 10;
sizeof (str ) = ? (1)
sizeof ( p ) = ? (2)
sizeof ( n ) = ? (3) void Foo ( char str [100]) (
mm
sizeof( str ) = ?(4)
}
void *p = malloc( 100 );
mm
sizeof ( p ) = ? (5)
(1)17 (2) 4 (3) 4 (4) 4 (5) 4
13.阅读下⾯代码,回答问题.
1). void G et Memory (char **p, int num) {
*p ⼆(char *)malloc(num);
}
void Test(void){
char *str = NULL;
G etMemory(festr, 100); strcpy(str, "hello"); print f (str);
}
请问运⾏Test函数会有什么样的结果?
输岀“he"
2). char *GetMemory(void) {
char p[] = "hello world*; return p;
}
void Test (void) I
char *str = NULL; str = G etMemory (); print f (str);
}
请问运⾏Test函数会有什么样的结果?
⽆效的指针,输岀不确定
14.C++中为什么⽤模板类。
(1 )可⽤来创建动态増长和减⼩的数据结构
(2)它是类型⽆关的,因此具有很⾼的可复⽤性。
(3)它在编译时⽽不是运⾏时检查数据类型,保证了类型安全(4)它是平台⽆关的,可移植性
(5)可⽤于基本数据类型
15.程序什么时候应该使⽤线程,什么时候单线程效率⾼。
1.耗时的操作使⽤线程,提⾼应⽤程序响应
2.并⾏操作时使⽤线程,如C/S架构的服务器端并发线程响应⽤户的请求。
3.多CPU系统中,使⽤线程提⾼CPU利⽤率
4.改善程序结构。⼀个既长⼜复杂的进程可以考虑分为多个线程,成为⼏个独⽴或
半独
⽴的运⾏部分,这样的程序会利于理解和修改。
其他情况都使⽤单线程。
16.Linux有内核级线程吗?
线程通常被定义为⼀个进程中代码的不同执⾏路线。从实现⽅式上划分,线程有两种类型:“⽤户级线程〃和“内核级线程〃O
⽤户线程指不需要内核⽀持⽽在⽤户程序中实现的线程,其不依赖于操作系统核⼼,应⽤进程利⽤线程库提供创建、同步、调度和管理线程的函数来控制⽤户线程。这种线程甚⾄在象DOS这样的操作系统中也可实现,但线程的调度需要⽤户程序完成,这有些类似Windows 3.x的协作式多任务。另外⼀种则需要内核的参与,由内核完成线程的调度。其依赖于操作系统核⼼, 由内核的内部需求进⾏创建和撤销,这两种模型各有其好处和缺点。⽤户线程不需要额外的内核开⽀
,并且⽤户态线程的实现⽅式可以被定制或修改以适应特殊应⽤的要求,但是当⼀个线程因I/O⽽处于等待状态时,整个进程就会被调度程序切换为等待状态,苴他线程得不到运⾏的机会;⽽内核线程则没有各个限制,有利于发挥多处理器的并发优势,但却占⽤了更多的系统开⽀。
Windows NT和OS/2⽀持内核线程。Linux⽀持内核级的多线程。
17.C++中什么数据分配在栈或堆中,New分配数据是在近堆还是远堆中?
栈:存放局部变量,函数调⽤参数,函数返回值,函数返回地址。由系统管理堆:程序运⾏时动态申请,new和malloc申请的内存就在堆上。
18.使⽤线程是如何防⽌出现⼤的波峰。
意思是如何防⽌同时产⽣⼤量的线程,⽅法是使⽤线程池,线程池具有可以同时提⾼调度效率和限制资源使⽤的好处,线程池中的线程达到最⼤数时,其他线程就会排队等候。
19.函数模板与类模板有什么区别?
函数模板的实例化是由编译程序在处理函数调⽤时⾃动完成的,⽽类模板的实例化必须由程序员在程序中显式地指定。
20.winsock建⽴连接的主要实现步骤?
服务器端:sockerO建⽴套接字,绑定(bind)并监听(listen),⽤accept ()等待客户端连接。
客户端:sockerO建⽴套接字,连接(connect)服务器,连接上后使⽤send。和recv (),在套接字上写读数据,直⾄数据交换完毕,closesocket 0关闭套接字。
服务器端:accept ()发现有客户端连接,建⽴⼀个新的套接字,⾃⾝重新开始等待连接。该新产⽣的套接字使⽤send。和recv ()写读数据,直⾄数据交换完毕,closesocket 0关闭套接字。
21.动态连接库的两种⽅式?
调⽤⼀个DLL中的函数有两种⽅法:
1.载⼊时动态槌接(load-time dynainic linking),模块⾮常明确调⽤某个导岀函数,
使得他们就像本地函数⼀样。这需要槌接时槌接那些函数所在DLL卽寻⼊库,导⼊库向系统提供了载⼊DLL时所需的傷息:及DLL函数定位。
2.运⾏时动态槌接(run-time dynainic linking),运⾏时可以通过LoadLibrary或
LoadLibraryEx函数载⼊DLL。DLL载⼊后,模块可以通过调⽤GetProcAddress获取DLL函数的岀⼝地址,然后就可以通过返回的函数指针调⽤DLL函数了。如此即可避免导⼊库⽂件了。
22.IP组播有那些好处?
Internet ±产⽣的许多新的应⽤,特别是⾼带宽的多媒体应⽤,带来了带宽的急剧消耗和⽹絡拥挤问题。组播是⼀种允许⼀个或多个发送者(组播源)发送单⼀的数据包到多个接收者(⼀次的,同时的)的⽹络技术。组播可以⼤⼤的节省⽹络带宽,因为⽆论有多少个⽬标地址,在整个⽹络的任何⼀条链路上只传送单⼀的数据包。所以说组播技术的核⼼就是针对如何节约⽹络资源的前提下保证服务质量。
23.列举⼏种进程的同步机制及优缺点
1)信号量机制:⼀个信号量只能置⼀次初值,以后只能对之进⾏P操作或V操作。
由此也可以看到,信号量机制必须有公共内存,不能⽤于分布式操作系统,这是它最⼤的弱点。
2)⾃旋锁:旋锁是为了保护共享资源提岀的⼀种锁机制。
调⽤者申请的资源如果被占⽤,即⾃旋锁被已经被别的执⾏单元保持,则调⽤者⼀直循环在那⾥看是否该⾃旋锁的保持着已经释放了锁.⾃旋锁是⼀种⽐较低级的保护数据结构和代码⽚段的原始⽅式,可能会引起以下两个问
题;
(1)死锁
(2)过多地占⽤CPU资源
3)部:信号量机制功能强⼤,但使⽤时对信号量的操作分散,⽽且难以控制,读写和維护都很困难。因此后来⼜提岀了⼀种集中式同步进程⼀⼀管程。其基本思想是将共享变量
和对它们的操作集中在⼀个模块中,操作系统或并发程序就由这样的模块构成。这样模块之间联系清晰,便于维护和修改,易于保证正确性。
4)会合:进程直接进⾏相互作⽤
5)分布式系统:由于在分布式操作系统中没有公共内存,因此参数全为值参,
希且不可为指针。
优缺点:
信号量(Seiwhore)及PV操作
优:PV操作能够实现对临界区的管理要求;实现简单;允许使⽤它的代码休眠,持有锁的时间可相对较长。
缺:信号量机制必须有公共内存,不能⽤于分布式操作系统,这是它最⼤的
弱点。信号量机制功能强⼤,但使⽤时对信号量的操作分散,⽽且难以控制, 读写和維护都很困难。
加重了程序员的编码负担;核⼼操作P-V分散在各⽤户程序的代码中,不易控制和管理;⼀旦错误,后果严重,且不易发现和纠正。
⾃旋锁:
优:旋锁是为了保护共享资源提岀的⼀种锁机制;调⽤者申请的资源如果被占⽤,即⾃旋锁已经被别的执⾏单元保持,则调⽤者⼀直循环在那⾥看是否该⾃旋锁的保持者
已经释放了锁;低开销;安全和⾼效;
缺:⾃旋锁是⼀种⽐较低级的保护数据结构和代码⽚段的原始⽅式,可能会引起以下两个问题;
(1)死锁
(2)过多地占⽤CPU资源
传统⾃旋锁由于⽆序竞争会导致“公平性"问题
优:集中式同步进程⼀⼀管程。其基本思想是将共享变量和对它们的操作集中在⼀个模块中,操作系统或并发程序就由这样的模块构成。这样模块之间联系清晰,便于維护和修改,
易于保证正确性。
缺:如果⼀个分布式系统具有多个CPU,并且每个CPU拥有⾃⼰的私有内存, 它们通过⼀个局域⽹相连,那么这些原语将失效。⽽管程在少数⼏种编程语⾔之外⼜⽆
荏使⽤,并且,这些原语均未提供机器间的信息交换⽅法。
会合:进程直接进⾏相互作⽤
分布式系统:消息和rpc
由于在分布式操作系统中没有公共内存,因此参数全为值参,⽽且不可为指针24.什么是预编译,何时需要预编译?
(1)总是使⽤不经常改动的⼤型代码体
(2)程序由多个模块组成,所有模块都使⽤⼀组标准的包含⽂件和相同的编译选
项。在这种
情况下,可以将所有包含⽂件预编译为⼀个预编译头
预编译⼜称为预处理,是做些代码⽂本的替换⼯作
处理#开头的指令,⽐如拷贝# include包含的⽂件代码,# define宏定
义的营换,条件编译等
就是为编译做的预备⼯作的阶段
主要处理#开始的預编译指令
预编译指令指⽰了在程序正式编译前就由编译器进⾏的操作,可以放在程序中的任何位置。常见的预编译指令有:>>
25.int(*s[10])(int)表⽰的是什么?
int (*s[10])(int)函数指正数组,每个指正指向⼀个int func(int param) 的函数.
26.交换两个变量的值,不使⽤第三个变量.即a=3,b=5,交换后a=5,b=3.
Internet上产⽣的许多有两种解放,⼀种⽤算术算法,⼀种⽤〃(异或) a=a+b;
b=a-b;
a=a~b;
或者
a⼆a\;〃只能对int, char..
b ⼆ab
a=a b
27.要对绝对地址0x100000赋值,我们可以⽤unsigned
int)0xl00000=1234;那么要是想让程序跳转到绝对地址是
0x100000去执⾏,应该怎么做?
*((void(*) ())0x100000) 0;
先要将0x100000强制转换成函数指针即:(void(*) ())0x100000。然后再调⽤它:*((void(*) ())0x100000)();⽤typedef 可以看得更直观些:
typedef void(*)() voidFuncPtr;
*((voidFuncPtr)0x100000)();
28.线程与进程的区别和联系?线程是否具有相同的堆栈?d
是否有独⽴的堆栈?
进程是死的,只是⼀些资源的集合,真正的程序执⾏都是线程来完成的,程序启动的时候操作系统就帮你创建线程。每个线程有⾃⼰的堆栈。DLL中有没有独⽴的堆栈,这个问题不好回答,或者说这个问题本⾝是否有问题。因为

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。