《华为c语言面试题.docx》由会员分享,可在线阅读,更多相关《华为c语言面试题.docx(65页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、华为C语言面试题集C语言面试题-华为C语言面试题深圳华为面试 C语言面试题1、局部变量能否和全局变量重名?答:能,局部会屏蔽全局。要用全局变量,需要使用:局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。2、如何引用一个已经定义过的全局变量?答:extern可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,
2、如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。3、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?答:可以,在不同的C文件中以static形式来声明同名全局变量。可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错4、语句for(;1;)有什么问题?它是什么意思?答:和while相同。5、dowhile 和 whiledo 有什么区别?答:前一个循环一遍再判断,后一个判断以后再循环6、请写出下列代码的输出内容#includemain()int a,b,czd;a=10;b=a+;c=
3、+a;d=10*a+;printf(b, c, d:%d,%d,%d, b, c, d);return 0;)答:10,12,1207、static全局变量与普通的全局变量有什么区别? static局部变量和普通局部变量有什么区别? static函数与普通函数有什么区别?全局变量(外部变量)的说明之前再冠以static就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只
4、在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。static函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件static全局变量与普通的
5、全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝.8、程序的局部变量存在于(堆栈)中,全局变量存在于(静态区)中,动态申请数据存在于(堆)中。9、设有以下说明和定义:type def union long i; int k5; char c; DATE;struct data int cat; DATE cow; double dog; too;DAT
6、E max;则语句 printf(%d,sizeof(struct date)+sizeof(max);的执行结果是:52答:DATE是一个union,变量公用空间.里面最大的变量类型是 int5L占用20个字节.所以它的大小是20data是一个struct,每个变量分开占用空间.依次为int4+ DATE20+ doubles =32.所以结果是20+32=52.当然在某些16位编辑器下,int可能是2字节,那么结果是int2+DATE10+ doubles =2010、队列和栈有什么区别?队列先进先出,栈后进先出11、写出下列代码的输出内容#includeint inc(int a)ret
7、urn(+a);int multi(int*a,int*b,int*c)return(*c=*a*b);typedef int(FUNCl)(int in);typedef int(FUNC2)(int*,int*,int*);void show(FUNC2 funjnt argl, int*arg2)(INCp=&inc;int temp =p(argl);fun(&temp,&argl, arg2);printf(%dn,*arg2);main()int a;show(multi,10,&a);return 0;答:11012、请找出下面代码中的所以错误说明:以下代码是把一个字符串倒序,如
8、“abed”倒序后变为“dcba”1#includestring.h2、main()3、(4、 char*src=hello,world;5、 char* dest=NULL;6、 int len=strlen(src);7、 dest=(char*)malloc(len);8、 char* d=dest;9、 char* s=srclen;10、while(len-!=0)11、 d+=s-;12、printf(%s,dest);13 return 0;14、)答:方法1:int main()char* src =hello,world;int len = strlen(src);char*
9、 dest =(char*)malloc(len+l);要为0分配一个空间char* d = dest;char* s =&srclen-l;指向最后一个字符while( len-!=0)*d+=*s-;*d =0;尾部要加0printf(%sn,dest);free(dest);/使用完,应当释放空间,以免造成内存汇泄露 return 0;方法2:#include#includemain()char str=hello,world;int len=strlen(str);char t;for(int i=0; i t=stri;stri=strlen-i-l; strlen-i-l=t;pr
10、intf(%s,str);return 0;l.-l,2,7,28,126请问28和126中间那个数是什么?为什么?第一题的答案应该是4A3-1=63规律是M3-l(当n为偶数0,2,4)M3+1(当n为奇数1,3,5)答案:632.用两个栈实现一个队列的功能?要求给出算法和思路!设2个栈为A,B,一开始均为空.入队:将新元素push入栈A;出队:判断栈B是否为空;如果不为空,则将栈A中所有元素依次pop出并push到栈B:将栈B的栈顶元素pop出;这样实现的队列入队和出队的平摊复杂度都还是0(1),比上面的几种方法要好。3.在c语言库函数中将一个字符转换成整型的函数是 atool()吗,这个
11、函数的原型是什么?函数名:atol功能:把字符串转换成长整型数用法:long atol(const char *nptr);程序例:#include#includeint main(void)long I;char *str =98765432;I = atol(lstr);printf(string =%s integer =%ldn, str, I);return(O);13 .对于一个频繁使用的短小函数,在C语言中应用什么实现,在 C+中应用什么实现?c用宏定义,C+用inline14 .直接链接两个信令点的一组链路称作什么?PPP点到点连接15 .接入网用的是什么接口?16 .voip
12、都用了那些协议?17 .软件测试都有那些种类?黑盒:针对系统功能的测试白合:测试函数功能,各函数接口18 .确定模块的功能和模块的接口是在软件设计的那个队段完成的?概要设计阶段19 .enum stringxl,x2,x3=10,x4,x5,x;问 x=0x801005,0x8010f4;20 .unsigned char *pl;unsigned long *p2;pl=(unsigned char *)0x801000;p2=(unsigned long *)0x810000;请问pl+5=;p2+5=;选择题:21 .Ethternet链接到Internet用到以下那个协议?A.HDLC
13、;B.ARP;C.UDP;D.TCP;E.ID22 .属于网络层协议的是:A.TCP;B.IP;C.ICMP;D.X.2523 .Windows消息调度机制是:A.指令队列;B.指令堆栈;C.消息队列;D.消息堆栈;24 .unsigned short hash(unsigned short key)return (key)%256请问hash(16),hash(256)的值分别是:A.1.16;B.8.32;C.4.16;D.1.32找错题:25 .请问下面程序有什么错误?inta602501000J,j,k;for(k=0;k=1000;k+)for(j=0;j250;j+)for(i=0
14、;iMax_GT_Length)return GT_Length_ERROR;问答题:29.IP Phone的原理是什么?IPV630.TCP/IP通信建立的过程怎样,端口有什么作用?三次握手,确定是哪个应用程序使用该协议31.1号信令和7号信令有什么区别,我国某前广泛使用的是那一种?答:1号信令接续慢,但是稳定,可靠。7号信令的特点是:信令速度快,具有提供大量信令的潜力,具有改变和增加信令的灵活性,便于开放新业务,在通话时可以随意处理信令,成本低。目前得到广泛应用。TCP与UDP的区别;TCP是面向连接的协议,就象打电话;而UDP是无连接的协议,就象邮寄信件。TCP是可靠的,它需要确认,而U
15、DP是不可靠的,因为它不需要确认。所以一般情况下重要数据的传输都用TCP,不太重要的,丢失后不会造成太大影响的数据都用UDP来传输。与TCP相比,UDP帧的长度要小的多。预处理器(Preprocessor)1.用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)#define SECONDS_PER_YEAR (60*60*24*365)UL我在这想看到几件事情:1) .#define语法的基本知识(例如:不能以分号结束,括号的使用,等等)2) .懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。
16、3) .意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。4) .如果你在你的表达式中用到UL (表示无符号长整型),那么你有了一个好的起点。记住,第一印象很重要。C+面试题集,C+面试答案,C+面试,C+试题,C+试卷2.写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。#define MIN(A,B)(A6) puts(6): puts(6”。原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。因此-20变成了一个非常大的正整数,所以该表达式计算出的结果大于6。这一点对于应当频繁用到无符号数据类型的嵌
17、入式系统来说是丰常重要的。如果你答错了这个问题,你也就到了得不到这份工作的边缘。13 .评价下面的代码片断:unsigned int zero =0;unsigned int compzero = OxFFFF;/*ls complement of zero */对于一个int型不是16位的处理器为说,上面的代码是不正确的。应编写如下:unsigned int compzero =0;这一问题真正能揭露出应试者是否懂得处理器字长的重要性。在我的经验里,好的嵌入式程序员非常准确地明白硬件的细节和它的局限,然而PC机程序往往把硬件作为一个无法避免的烦恼。到了这个阶段,应试者或者完全垂头丧气了或者信
18、心满满志在必得。如果显然应试者不是很好,那么这个测试就在这里结束了。但如果显然应试者做得不错,那么我就扔出下面的追加问题,这些问题是比较难的,我想仅仅非常优秀的应试者能做得不错。提出这些问题,我希望更多看到应试者应付问题的方法,而不是答案。不管如何,你就当是这个娱乐吧动态内存分配(Dynamic memory allocation)14 .尽管不像非嵌入式计算机那么常见,嵌入式系统还是有从堆(heap)中动态分配内存的过程的。那么嵌入式系统中,动态分配内存可能发生的问题是什么?这里,我期望应试者能提到内存碎片,碎片收集的问题,变量的持行时间等等。这个主题已经在ESP杂志中被广泛地讨论过了(主要
19、是PJ. Plauger,他的解释远远超过我这里能提到的任何解释),所有回过头看一下这些杂志吧!让应试者进入一种虚假的安全感觉后,我拿出这么一个小节目:下面的代码片段的输出是什么,为什么?char *ptr;if (ptr =(char *)malloc(0)= NULL) puts(Got a null pointer);elseputs(Got a valid pointer);这是一个有趣的问题。最近在我的一个同事不经意把0值传给了函数 malloc,得到了一个合法的指针之后,我才想到这个问题。这就是上面的代码,该代码的输出是Got a valid pointer。我用这个来开始讨论这样
20、的一问题,看看被面试者是否想到库例程这样做是正确。得到正确的答案固然重要,但解决问题的方法和你做决定的基本原理更重要些。Typedef15 . Typedef在C语言中频繁用以声明一个已经存在的数据类型的同义字。也可以用预处理器做类似的事。例如,思考一下下面的例子:#define dPS struct s *typedef struct s * tPS;以上两种情况的意图都是要定义dPS和tPS作为一个指向结构s指针。哪种方法更好呢?(如果有的话)为什么?这是一个非常微妙的问题,任何人答对这个问题(正当的原因)是应当被恭喜的。答案是:typedef更好。思考下面的例子:dPS pl,p2;tP
21、S p3,p4;第一个扩展为struct s * pl, p2;上面的代码定义pl为一个指向结构的指,p2为一个实际的结构,这也许不是你想要的。第二个例子正确地定义了 P3和p4两个指针。晦涩的语法16 . C语言同意一些令人震惊的结构,下面的结构是合法的吗,如果是它做些什么?int a =5, b =7, c;c = a+b;这个问题将做为这个测验的一个愉快的结尾。不管你相不相信,上面的例子是完全合乎语法的。问题是编译器如何处理它?水平不高的编译作者实际上会争论这个问题,根据最处理原则,编译器应当能处理尽可能所有合法的用法。因此,上面的代码被处理成:c = a+ b;因此,这段代码持行后a
22、=6, b =7, c =12o如果你知道答案,或猜出正确答案,做得好。如果你不知道答案,我也不把这个当作问题。我发现这个问题的最大好处是:这是一个关于代码编写风格,代码的可读性,代码的可修改性的好的话题What will print out?main()(char *pl=name;char *p2;p2=(char*)malloc(20);memset (p2,0,20);while(*p2+=*pl+);printf(%sn,p2);Answer:empty string.What will be printed as the result of the operation below:
23、main() int x=20,y=35;x=y+ x+;y=+y +x;printf(%d%dn”,x,y);Answer:5794What will be printed as the result of the operation below:main()(int x=5;printf(%d,%d,%dn,x,x2,x2);)Answer:5,20,1What will be printed as the result of the operation below:#define swap(a,b) a=a+b;b=a-b;a=a-b;void main。(int x=5, y=10;s
24、wap (x,y);printf(%d %dn”,x,y);swap2(x,y);printf(w%d %dn”,x,y);int swap2(int a, int b)(int temp;temp=a;b=a;a=temp;return 0;)10,5What will be printed as the result of the operation below:main()(char *ptr = Cisco Systems;*ptr+; printf(%sn,ptr);ptr+;printf(%sn”,ptr);Answer:Cisco Systemsisco systemsWhat
25、will be printed as the result of the operation below:main()(char sl=z/Ciscow;char s2=systems;printf(%s”,sl);Answer: CiscoWhat will be printed as the result of the operation below:main()(char *pl;char *p2;pl=(char *)malloc(25);p2=(char *)malloc(25);strcpy(pl/Cisco/);strcpy(p2,“systems);strcat(pl,p2);printf(%s,pl);Answer: CiscosystemsThe following variable is available in filel.c, who can access it?: static int average;Answer: all the functions in the filel.c can access the variable.WHat will be the result of the following code?#define TRUE 0/ s
限制150内