C语言软件工程师笔试题大全_第1页
C语言软件工程师笔试题大全_第2页
C语言软件工程师笔试题大全_第3页
C语言软件工程师笔试题大全_第4页
C语言软件工程师笔试题大全_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、网络安全应应具有以下下五个方面面的特征: 保密性:信信息不泄露露给非授权权用户、 HYPERLINK /view/21996.htm 实实体或过程程,或供其其利用的特特性。 完整性:数数据未经授授权不能进进行改变的的特性。即即信息在存存储或传输输过程中保保持不被修修改、不被被破坏和丢丢失的特性性。 可用性:可可被授权实实体访问并并按需求使使用的特性性。即当需需要时能否否存取所需需 的信息。例例如网络环环境下拒绝绝服务、破破坏网络和和有关系统统的正常运运行等都属属于对可用用性的攻击击; 可控性:对对信息的传传播及内容容具有控制制能力。 可审查性:出现安全全问题时提提供依据与与手段第一一部分:基基

2、本概念及及其它问答答题1、关关键字sttaticc的作用是是什么?这这个简单的的问题很少少有人能回回答完全。在C语言言中,关键键字staatic有有三个明显显的作用:1). 在函数体体,一个被被声明为静静态的变量量在这一函函数被调用用过程中维维持其值不不变。2). 在模模块内(但但在函数体体外),一一个被声明明为静态的的变量可以以被模块内内所用函数数访问,但但不能被模模块外其它它函数访问问。它是一一个本地的的全局变量量。3). 在模块块内,一个个被声明为为静态的函函数只可被被这一模块块内的其它它函数调用用。那就是是,这个函函数被限制制在声明它它的模块的的本地范围围内使用。(本地化数数据和代码码

3、范围的好好处和重要要性)。2、“引用用”与指针针的区别是是什么?答答 、1) 引用必必须被初始始化,指针针不必。22) 引用用初始化以以后不能被被改变,指指针可以改改变所指的的对象。33) 不存存在指向空空值的引用用,但是存存在指向空空值的指针针。指针通通过某个指指针变量指指向一个对对象后,对对它所指向向的变量间间接操作。程序中使使用指针,程程序的可读读性差;而而引用本身身就是目标标变量的别别名,对引引用的操作作就是对目目标变量的的操作。流流操作符、赋值操操作符=的的返回值、拷贝构造造函数的参参数、赋值值操作符=的参数、其它情况况都推荐使使用引用。3、.h头头文件中的的ifnddef/ddef

4、inne/enndif 的作用?答:防止止该头文件件被重复引引用。4、#inncludde 与 #inccludee “fiile.hh”的区别别?答:前前者是从SStanddard Librrary的的路径寻找找和引用ffile.h,而后后者是从当当前工作路路径搜寻并并引用fiile.hh。5、描述实实时系统的的基本特性性答 :在在特定时间间内完成特特定的任务务,实时性性与可靠性性。6、全局变变量和局部部变量在内内存中是否否有区别?如果有,是是什么区别别?答 :全局变量量储存在静静态数据区区,局部变变量在堆栈栈中。7、什么是是平衡二叉叉树?答 :左右子子树都是平平衡二叉树树 且左右右子树的深

5、深度差值的的绝对值不不大于1。8、堆栈溢溢出一般是是由什么原原因导致的的?答 :1.没有有回收垃圾圾资源2.层次太深深的递归调调用9、冒泡排排序算法的的时间复杂杂度是什么么?答 :O(n2)100、什么函函数不能声声明为虚函函数?答:consstrucctor11、队列列和栈有什什么区别?答:队列列先进先出出,栈后进进先出12、不能能做swiitch()的参数数类型答 :swiitch的的参数不能能为实型。13、局部部变量能否否和全局变变量重名?答:能,局局部会屏蔽蔽全局。要要用全局变变量,需要要使用”:”局部部变量可以以与全局变变量同名,在在函数内引引用这个变变量时,会会用到同名名的局部变变

6、量,而不不会用到全全局变量。对于有些些编译器而而言,在同同一个函数数内可以定定义多个同同名的局部部变量,比比如在两个个循环体内内都定义一一个同名的的局部变量量,而那个个局部变量量的作用域域就在那个个循环体内内14、如何何引用一个个已经定义义过的全局局变量?答答 、可以以用引用头头文件的方方式,也可可以用exxternn关键字,如如果用引用用头文件方方式来引用用某个在头头文件中声声明的全局局变量,假假定你将那那个变量写写错了,那那么在编译译期间会报报错,如果果你用exxternn方式引用用时,假定定你犯了同同样的错误误,那么在在编译期间间不会报错错,而在连连接期间报报错。15、全局局变量可不不可

7、以定义义在可被多多个.C文文件包含的的头文件中中?为什么么?答 、可以,在在不同的CC文件中以以stattic形式式来声明同同名全局变变量。可以以在不同的的C文件中中声明同名名的全局变变量,前提提是其中只只能有一个个C文件中中对此变量量赋初值,此此时连接不不会出错。16、语句句for( ;1 ;)有什什么问题?它是什么么意思?答答 、和wwhilee(1)相相同,无限限循环。17、doowhhile和和whilleddo有什么么区别?答答 、前一一个循环一一遍再判断断,后一个个判断以后后再循环。18、sttatacc 全局变变量、局部部变量、函函数与普通通全局变量量、局部变变量、函数数答 、全

8、全局变量(外部变量量)的说明明之前再冠冠以staatic 就构成了了静态的全全局变量。全局变量量本身就是是静态存储储方式, 静态全局局变量当然然也是静态态存储方式式。 这两两者在存储储方式上并并无不同。这两者的的区别虽在在于非静态态全局变量量的作用域域是整个源源程序, 当一个源源程序由多多个源文件件组成时,非非静态的全全局变量在在各个源文文件中都是是有效的。 而静态态全局变量量则限制了了其作用域域, 即只只在定义该该变量的源源文件内有有效, 在在同一源程程序的其它它源文件中中不能使用用它。由于于静态全局局变量的作作用域局限限于一个源源文件内,只只能为该源源文件内的的函数公用用, 因此此可以避免

9、免在其它源源文件中引引起错误。从以上分分析可以看看出, 把把局部变量量改变为静静态变量后后是改变了了它的存储储方式即改改变了它的的生存期。把全局变变量改变为为静态变量量后是改变变了它的作作用域, 限制了它它的使用范范围。sttaticc函数与普普通函数作作用域不同同。仅在本本文件。只只在当前源源文件中使使用的函数数应该说明明为内部函函数(sttaticc),内部部函数应该该在当前源源文件中说说明和定义义。对于可可在当前源源文件以外外使用的函函数,应该该在一个头头文件中说说明,要使使用这些函函数的源文文件要包含含这个头文文件staatic全全局变量与与普通的全全局变量有有什么区别别:staati

10、c全全局变量只只初使化一一次,防止止在其他文文件单元中中被引用;stattic局部部变量和普普通局部变变量有什么么区别:sstatiic局部变变量只被初初始化一次次,下一次次依据上一一次结果值值;staatic函函数与普通通函数有什什么区别:stattic函数数在内存中中只有一份份,普通函函数在每个个被调用中中维持一份份拷贝19、程序序的内存分分配答:一一个由c/C+编编译的程序序占用的内内存分为以以下几个部部分1、栈栈区(sttack)由编译器器自动分配配释放,存存放函数的的参数值,局局部变量的的值等。其其操作方式式类似于数数据结构中中的栈。22、堆区(hheap)一般由程程序员分配配释放,

11、若若程序员不不释放,程程序结束时时可能由OOS回收。注意它与与数据结构构中的堆是是两回事,分分配方式倒倒是类似于于链表,呵呵呵。3、全局区(静静态区)(sstatiic)全全局变量和和静态变量量的存储是是放在一块块的,初始始化的全局局变量和静静态变量在在一块区域域,未初始始化的全局局变量和未未初始化的的静态变量量在相邻的的另一块区区域。程序序结束后由由系统释放放。4、文文字常量区区常量字字符串就是是放在这里里的。程序序结束后由由系统释放放。5、程程序代码区区存放函函数体的二二进制代码码例子程序这这是一个前前辈写的,非非常详细/maiin.cpppintt a=00; /全局初始始化区chhar

12、 *p1; /全局局未初始化化区maiin()intbb;栈chhar ss=”abc”; /栈chaar *pp2; /栈chhar *p3=”1234456; /112345560在在常量区,pp3在栈上上。staatic int c=0; /全全局(静态态)初始化化区p1 = (cchar*)mallloc(10);p2 = (chhar*)mallloc(220); /分配配得来得110和200字节的区区域就在堆堆区。sttrcpyy(p1,”1233456); /12334560放在常常量区,编编译器可能能会将它与与p3所向向”1233456优化成一一个地方。20、解释释堆和栈的的区

13、别答:堆(heeap)和和栈(sttack)的区别(11)申请方方式staack:由由系统自动动分配。例例如,声明明在函数中中一个局部部变量innt b;系统自动动在栈中为为b开辟空空间heaap:需要要程序员自自己申请,并并指明大小小,在c中中mallloc函数数如p1=(chaar*)mmallooc(100);在C+中中用neww运算符,如p2=(charr*)maallocc(10);但是注注意p1、p2本身身是在栈中中的。(22)申请后后系统的响响应栈:只只要栈的剩剩余空间大大于所申请请空间,系系统将为程程序提供内内存,否则则将报异常常提示栈溢溢出。堆:首先应该该知道操作作系统有一一

14、个记录空空闲内存地地址的链表表,当系统统收到程序序的申请时时,会遍历历该链表,寻寻找第一个个空间大于于所申请空空间的堆结结点,然后后将该结点点从空闲结结点链表中中删除,并并将该结点点的空间分分配给程序序,另外,对对于大多数数系统,会会在这块内内存空间中中的首地址址处记录本本次分配的的大小,这这样,代码码中的deeletee语句才能能正确的释释放本内存存空间。另另外,由于于找到的堆堆结点的大大小不一定定正好等于于申请的大大小,系统统会自动的的将多余的的那部分重重新放入空空闲链表中中。(3)申申请大小的的限制栈:在Winndowss下,栈是是向低地址址扩展的数数据结构,是是一块连续续的内存的的区域

15、。这这句话的意意思是栈顶顶的地址和和栈的最大大容量是系系统预先规规定好的,在在WINDDOWS下下,栈的大大小是2MM(也有的的说是1MM,总之是是一个编译译时就确定定的常数),如如果申请的的空间超过过栈的剩余余空间时,将将提示ovverfllow。因因此,能从从栈获得的的空间较小小。堆:堆堆是向高地地址扩展的的数据结构构,是不连连续的内存存区域。这这是由于系系统是用链链表来存储储的空闲内内存地址的的,自然是是不连续的的,而链表表的遍历方方向是由低低地址向高高地址。堆堆的大小受受限于计算算机系统中中有效的虚虚拟内存。由此可见见,堆获得得的空间比比较灵活,也也比较大。(4)申申请效率的的比较:栈

16、栈:由系统统自动分配配,速度较较快。但程程序员是无无法控制的的。堆:是是由neww分配的内内存,一般般速度比较较慢,而且且容易产生生内存碎片片,不过用用起来最方方便.另外外,在WIINDOWWS下,最最好的方式式是用Viirtuaal Allloc分分配内存,他他不是在堆堆,也不是是在栈,而而是直接在在进程的地地址空间中中保留一块块内存,虽虽然用起来来最不方便便。但是速速度快,也也最灵活。(5)堆堆和栈中的的存储内容容栈:在函函数调用时时,第一个个进栈的是是主函数中中后的下一一条指令(函函数调用语语句的下一一条可执行行语句)的的地址,然然后是函数数的各个参参数,在大大多数的CC编译器中中,参数

17、是是由右往左左入栈的,然然后是函数数中的局部部变量。注注意静态变变量是不入入栈的。当当本次函数数调用结束束后,局部部变量先出出栈,然后后是参数,最最后栈顶指指针指向最最开始存的的地址,也也就是主函函数中的下下一条指令令,程序由由该点继续续运行。堆堆:一般是是在堆的头头部用一个个字节存放放堆的大小小。堆中的的具体内容容由程序员员安排。(66)存取效效率的比较较charr s1=”aaaaaaaaaaaaaaaaaaa”; aaaaaaaaaaaaa是是在运行时时刻赋值的的;chaar *ss2=”bbbbbbbbbbbbbbbbbbbbbb”; 而bbbbbbbbbbbbbb是在编译译时就确定定

18、的;但是是,在以后后的存取中中,在栈上上的数组比比指针所指指向的字符符串(例如如堆)快。比如:#iincluudevooidmaain()charr a=11;chaar c=”1123455678990;cchar *p=”123445678890;a = c1;a = p11;reeturnn;对应的汇汇编代码110:a=c1;00440106678A44DF1mmovcll,bytteptrrebpp-0Fhh004401066A8844DFCmmovbyytepttrebbp-4,cl111:a=p1;004401066D8B555ECmmoveddx,dwwordpptreebp-1

19、14h000401107088A42001movval,bbytepptreedx+11004401077388445FCmmovbyytepttrebbp-4,al第第一种在读读取时直接接就把字符符串中的元元素读到寄寄存器cll中,而第第二种则要要先把指针针值读到eedx中,在在根据eddx读取字字符,显然然慢了。21、什么么是预编译译,何时需需要预编译译?答:预预编译又称称为预处理理,是做些些代码文本本的替换工工作。处理理#开头的的指令,比比如拷贝#incllude包包含的文件件代码,#defiine宏定定义的替换换,条件编编译等,就就是为编译译做的预备备工作的阶阶段,主要要处理#开开始的

20、预编编译指令,预预编译指令令指示了在在程序正式式编译前就就由编译器器进行的操操作,可以以放在程序序中的任何何位置。cc编译系统统在对程序序进行通常常的编译之之前,先进进行预处理理。c提供的预预处理功能能主要有以以下三种:1)宏定定义2)文文件包含3)条件件编译22、关键键字connst是什什么含意?答: “connst意味味着常数”业余者。 “只读”正确的答答案。constt intt a; a是一个个常整型数数int consst a; a是一个个常整型数数consst innt *aa; a是一个个指向常整整型数的指指针(也就就是,整型型数是不可可修改的,但但指针可以以)。innt * c

21、onsst a; a是一个个指向整型型数的常指指针(也就就是说,指指针指向的的整型数是是可以修改改的,但指指针是不可可修改的)int const * a const; a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)1). 关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的。)2). 通过给优化器一些附加的信息,使用关键字const也许能产生更

22、紧凑的代码。3). 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现23、关键键字vollatille有什么么含意 并并给出三个个不同的例例子。答:一个定义义为vollatille的变量量是说这变变量可能会会被意想不不到地改变变,这样,编编译器就不不会去假设设这个变量量的值了。精确地说说就是,优优化器在用用到这个变变量时必须须每次都小小心地重新新读取这个个变量的值值,而不是是使用保存存在寄存器器里的备份份。下面是是volaatilee变量的几几个例子:1). 并行设备备的硬件寄寄存器(如如:状态寄寄存器)22)

23、. 一一个中断服服务子程序序中会访问问到的非自自动变量(Non-autoomatiic vaariabbles)3). 多线程应应用中被几几个任务共共享的变量量1). 一个参数数既可以是是consst还可以以是vollatille吗?解解释为什么么。是的。一个例子子是只读的的状态寄存存器。它是是volaatilee因为它可可能被意想想不到地改改变。它是是consst因为程程序不应该该试图去修修改它。22). 一一个指针可可以是voolatiile 吗吗?解释为为什么。是是的。尽管管这并不很很常见。一一个例子是是当一个中中服务子程程序修该一一个指向一一个bufffer的的指针时。3). 下面的函

24、函数有什么么错误:iint ssquarre(voolatiile iint *ptr)retuurn *ptr * *pptr;这段代码的的有个恶作作剧。这段段代码的目目的是用来来返指针*ptr指指向值的平平方,但是是由于*pptr指向向一个voolatiile型参参数,编译译器将产生生类似下面面的代码iint ssquarre(voolatiile iint *ptr)intt a,bb;a = *pttr;b = *pptr;rreturrn a * b;由于*pptr的值值可能被意意想不到地地该变,因因此a和bb可能是不不同的。结结果,这段段代码可能能返不是你你所期望的的平方值!正确的

25、代代码如下:longg squuare(volaatilee intt *pttr)int a;a = *pptr;rreturrn a * a;24、三种种基本的数数据模型答答:按照数数据结构类类型的不同同,将数据据模型划分分为层次模模型、网状状模型和关关系模型。25、结构构与联合有有和区别?答:(11). 结结构和联合合都是由多多个不同的的数据类型型成员组成成, 但在在任何同一一时刻, 联合中只只存放了一一个被选中中的成员(所所有成员共共用一块地地址空间), 而结构构的所有成成员都存在在(不同成成员的存放放地址不同同)。(22)对于联联合的不同同成员赋值值, 将会会对其它成成员重写, 原来

26、成成员的值就就不存在了了, 而对对于结构的的不同成员员赋值是互互不影响的的26、描述述内存分配配方式以及及它们的区区别?答:1) 从从静态存储储区域分配配。内存在在程序编译译的时候就就已经分配配好,这块块内存在程程序的整个个运行期间间都存在。例如全局局变量,sstatiic 变量量。2) 在栈上创创建。在执执行函数时时,函数内内局部变量量的存储单单元都可以以在栈上创创建,函数数执行结束束时这些存存储单元自自动被释放放。栈内存存分配运算算内置于处处理器的指指令集。33) 从堆堆上分配,亦亦称动态内内存分配。程序在运运行的时候候用mallloc 或neww 申请任任意多少的的内存,程程序员自己己负

27、责在何何时用frree 或或deleete 释释放内存。动态内存存的生存期期由程序员员决定,使使用非常灵灵活,但问问题也最多多27、请说说出connst与#defiine 相相比,有何何优点?答答:Connst作用用:定义常常量、修饰饰函数参数数、修饰函函数返回值值三个作用用。被Coonst修修饰的东西西都受到强强制保护,可可以预防意意外的变动动,能提高高程序的健健壮性。11) coonst 常量有数数据类型,而而宏常量没没有数据类类型。编译译器可以对对前者进行行类型安全全检查。而而对后者只只进行字符符替换,没没有类型安安全检查,并并且在字符符替换可能能会产生意意料不到的的错误。22) 有些些

28、集成化的的调试工具具可以对cconstt 常量进进行调试,但但是不能对对宏常量进进行调试。28、简述述数组与指指针的区别别?答:数数组要么在在静态存储储区被创建建(如全局局数组),要要么在栈上上被创建。指针可以以随时指向向任意类型型的内存块块。(1)修改内容容上的差别别charr a = “helllo”;aa0 = XX;chhar *p = “worrld”; / 注意p 指向常量量字符串pp0 = XX; / 编译译器不能发发现该错误误,运行时时错误(22) 用运运算符siizeoff 可以计计算出数组组的容量(字字节数)。sizeeof(pp),p 为指针得得到的是一一个 指针针变量的

29、字字节数,而而不是p 所指的内内存容量。C+/C 语言言没有办法法知道指针针所指的内内存容量,除除非在申请请内存时记记住它。注注意当数组组作为函数数的参数进进行传递时时,该数组组自动退化化为同类型型的指针。charr a = “helllo woorld”;chaar *pp = aa;couut sizeeof(aa) enddl; / 122 字节ccout siizeoff(p) eendl; / 4 字节节计算数组组和指针的的内存容量量voidd Funnc(chhar aa1000)coutt ssizeoof(a) endll; / 4 字字节而不是是100 字节29、分别别写出B

30、OOOL,iint,ffloatt,指针类类型的变量量a 与“零”的比比较语句。答:BOOOL : if ( !aa ) oor iff(a)iint : if ( a = 00)flooat : connst EEXPREESSIOON EXXP = 0.00000011if ( a -EXP)poinnter : iff ( aa != NULLL) orr if(a = NULLL) 30、如何何判断一段段程序是由由C 编译译程序还是是由C+编译程序序编译的?答:#iifdeff _ccplussplusscouttcc+;#elssecouutc;#endiif31、论述述含参数的的宏

31、与函数数的优缺点点答: 带参参宏 函数处理时时间 编译译时 程程序运行时时参数类型型 没有参参数类型问问题 定义义实参、形形参类型处处理过程 不分配内内存 分分配内存程程序长度 变长 不不变运行速速度 不占占运行时间间 调用和和返回占用用时间322、用两个个栈实现一一个队列的的功能?要要求给出算算法和思路路!答:设2个栈栈为A,BB, 一开开始均为空空.入队:将新元素素pushh入栈A;出队:(1)判判断栈B是是否为空;(2)如如果不为空空,则将栈栈A中所有有元素依次次pop出出并pussh到栈BB;(3)将栈B的的栈顶元素素pop出出;这样实实现的队列列入队和出出队的平摊摊复杂度都都还是O(

32、1), 比上面的的几种方法法要好33、嵌入入式系统中中经常要用用到无限循循环,你怎怎么样用CC编写死循循环呢?答答:这个问问题用几个个解决方案案。我首选选的方案是是:whiile(11)一些程序序员更喜欢欢如下方案案:forr(;)第三个方方案是用 gotooLoopp:.gotoo Looop;应试试者如给出出上面的方方案,这说说明或者他他是一个汇汇编语言程程序员(这这也许是好好事)或者者他是一个个想进入新新领域的BBASICC/FORRTRANN程序员。34、位操操作(Biit maanipuulatiion)答答: 嵌入入式系统总总是要用户户对变量或或寄存器进进行位操作作。给定一一个整型

33、变变量a,写写两段代码码,第一个个设置a的的bit 3,第二二个清除aa 的biit 3。在以上两两个操作中中,要保持持其它位不不变。对这这个问题有有三种基本本的反应11)不知道道如何下手手。该被面面者从没做做过任何嵌嵌入式系统统的工作。2) 用用bit fiellds。BBit ffieldds是被扔扔到C语言言死角的东东西,它保保证你的代代码在不同同编译器之之间是不可可移植的,同同时也保证证了的你的的代码是不不可重用的的。我最近近不幸看到到 Inffineoon为其较较复杂的通通信芯片写写的驱动程程序,它用用到了biit fiieldss因此完全全对我无用用,因为我我的编译器器用其它的的方

34、式来实实现bitt fieelds的的。从道德德讲:永远远不要让一一个非嵌入入式的家伙伙粘实际硬硬件的边。3) 用用 #deefinees 和 bit maskks 操作作。这是一一个有极高高可移植性性的方法,是是应该被用用到的方法法。最佳的的解决方案案如下:#defiine BBIT3 (0 x11 3)sttaticc intt a;void set_bit33(voiid)a |= BITT3;voidd cleear_bbit3(voidd)a &= BIIT3;一些人喜喜欢为设置置和清除值值而定义一一个掩码同同时定义一一些说明常常数,这也也是可以接接受的。我我希望看到到几个要点点:说

35、明常常数、|=和&=操作。35、访问问固定的内内存位置(AAccesssingg fixxed mmemorry loocatiions)答:嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址为0 x67a9的整型变量的值为0 xaa66。编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。这一问题测试你是否知道为了访问一绝对地址把一个整型数强制转换(typecast)为一指针是合法的。这一问题的实现方式随着个人风格不同而不同。典型的类似代码如下:int *ptr;ptr = (int *)0 x67a9;*ptr = 0 xaa66;A more o

36、bscure approach is:一个较晦涩的方法是:*(int * const)(0 x67a9) = 0 xaa55;即使你的品味更接近第二种方案,但我建议你在面试时使用第一种方案。36、中断断(Intterruupts)答: 中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展让标准C支持中断。具代表事实是,产生了一个新的关键字 _interrupt。下面的代码就使用了_interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。_intterruupt ddoublle coomputte_arrea (doubble rradiuus)do

37、ubble aarea = PII * rradiuus * radiius;pprinttf(nAreea = %f, areea);rreturrn arrea;这个函数数有太多的的错误了,以以至让人不不知从何说说起了:11)ISRR 不能返返回一个值值。如果你你不懂这个个,那么你你不会被雇雇用的。22) ISSR 不能能传递参数数。如果你你没有看到到这一点,你你被雇用的的机会等同同第一项。3) 在在许多的处处理器/编编译器中,浮浮点一般都都是不可重重入的。有有些处理器器/编译器器需要让额额处的寄存存器入栈,有有些处理器器/编译器器就是不允允许在ISSR中做浮浮点运算。此外,IISR应该该

38、是短而有有效率的,在在ISR中中做浮点运运算是不明明智的。44) 与第第三点一脉脉相承,pprinttf()经经常有重入入和性能上上的问题。如果你丢丢掉了第三三和第四点点,我不会会太为难你你的。不用用说,如果果你能得到到后两点,那那么你的被被雇用前景景越来越光光明了。337、动态态内存分配配(Dynnamicc memmory alloocatiion)答答:尽管不不像非嵌入入式计算机机那么常见见,嵌入式式系统还是是有从堆(hheap)中中动态分配配内存的过过程的。那那么嵌入式式系统中,动动态分配内内存可能发发生的问题题是什么?这里,我我期望应试试者能提到到内存碎片片,碎片收收集的问题题,变量

39、的的持行时间间等等。这这个主题已已经在ESSP杂志中中被广泛地地讨论过了了(主要是是 P.JJ. Pllaugeer, 他他的解释远远远超过我我这里能提提到的任何何解释),所所有回过头头看一下这这些杂志吧吧!让应试试者进入一一种虚假的的安全感觉觉后,我拿拿出这么一一个小节目目:下面的的代码片段段的输出是是什么,为为什么?cchar *ptrr;if (pttr = (chaar *)mallloc(00) = NUULL)pputs(Gott a nnull poinnter);ellsepuuts(Got a vaalid poinnter);这是是一个有趣趣的问题。最近在我我的一个同同事不

40、经意意把0值传传给了函数数mallloc,得得到了一个个合法的指指针之后,我我才想到这这个问题。这就是上上面的代码码,该代码码的输出是是Gott a vvalidd poiinterr。我用用这个来开开始讨论这这样的一问问题,看看看被面试者者是否想到到库例程这这样做是正正确。得到到正确的答答案固然重重要,但解解决问题的的方法和你你做决定的的基本原理理更重要些些。38、Typeedef答答:Typpedeff 在C语语言中频繁繁用以声明明一个已经经存在的数数据类型的的同义字。也可以用用预处理器器做类似的的事。例如如,思考一一下下面的的例子:#defiine ddPS sstrucct s *ty

41、ppedeff strruct s * tPS;以上两种种情况的意意图都是要要定义dPPS 和 tPS 作为一个个指向结构构s指针。哪种方法法更好呢?(如果有有的话)为为什么?这这是一个非非常微妙的的问题,任任何人答对对这个问题题(正当的的原因)是是应当被恭恭喜的。答答案是:ttypeddef更好好。思考下下面的例子子:dPSS p1,p2;ttPS pp3,p44;第一个个扩展为sstrucct s * p11, p22;上面的的代码定义义p1为一一个指向结结构的指,pp2为一个个实际的结结构,这也也许不是你你想要的。第二个例例子正确地地定义了pp3 和pp4 两个个指针。39、用变变量a给

42、出出下面的定定义答:aa) 一个个整型数(AAn inntegeer)b) 一个指指向整型数数的指针(AA poiinterr to an iintegger)cc) 一个个指向指针针的的指针针,它指向向的指针是是指向一个个整型数(AA poiinterr to a poointeer too an inteeger)d) 一个有10个整型数的数组(An array of 10 integers)e) 一个有10个指针的数组,该指针是指向一个整型数的(An array of 10 pointers to integers)f) 一个指向有10个整型数数组的指针(A pointer to an

43、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 integerargument and return an integer )答案是:aa) innt a; / An iintegg

44、erb) intt *a; / A poointeer too an inteegercc) innt *a; / A poinnter to aa poiinterr to an iinteggerd) intt a110; / AAn arrray of 110 inntegeerse) intt *a10; / An aarrayy of 10 ppointters to iinteggersff) innt (*a)110; / AA poiinterr to an aarrayy of 10 iinteggersgg) innt (*a)(iint); / A poointeer t

45、oo a ffuncttion a thhat ttakess an inteeger arguumentt andd retturnss an inteegerhh) innt (*a100)(iint); / An aarrayy of 10 ppointters to ffuncttionss thaat taake aan inntegeer arrgumeent aand rreturrn ann inttegerr40、解释释局部变量量、全局变变量和静态态变量的含含义。答:41、写写一个“标标准”宏答答:交换两两个参数值值的宏定义义为:. #deffine SWAPP(a,bb)(

46、aa)=(aa)+(bb);(b)=(a)-(b);(a)=(a)-(b);输入两个个参数,输输出较小的的一个:#defiine MMIN(AA,B) (A) nextt,并随后后删除原nnext指指向的节点点。第二部部分:程序序代码评价价或者找错错1、下面面的代码输输出是什么么,为什么么?voiid fooo(vooid)unsiignedd intt a = 6;iint bb = -20;(a+b 6) ? pputs(“ 66) : putts(“6。原因是当当表达式中中存在有符符号类型和和无符号类类型时所有有的操作数数都自动转转换为无符符号类型。因此-220变成了了一个非常常大的正整

47、整数,所以以该表达式式计算出的的结果大于于6。这一一点对于应应当频繁用用到无符号号数据类型型的嵌入式式系统来说说是丰常重重要的。如如果你答错错了这个问问题,你也也就到了得得不到这份份工作的边边缘。2、评价下下面的代码码片断:uunsiggned int zeroo = 00;unssigneed innt coompzeero = 0 xFFFFF;/*1s coompleementt of zeroo */对对于一个iint型不不是16位位的处理器器为说,上上面的代码码是不正确确的。应编编写如下:unsiignedd intt commpzerro = 0;这这一问题真真正能揭露露出应试者者

48、是否懂得得处理器字字长的重要要性。在我我的经验里里,好的嵌嵌入式程序序员非常准准确地明白白硬件的细细节和它的的局限,然然而PC机机程序往往往把硬件作作为一个无无法避免的的烦恼。33、 C语语言同意一一些令人震震惊的结构构,下面的的结构是合合法的吗,如如果是它做做些什么?int a = 5, bb = 77, c;c = a+b;这个个问题将做做为这个测测验的一个个愉快的结结尾。不管管你相不相相信,上面面的例子是是完全合乎乎语法的。问题是编编译器如何何处理它?水平不高高的编译作作者实际上上会争论这这个问题,根根据最处理理原则,编编译器应当当能处理尽尽可能所有有合法的用用法。因此此,上面的的代码被

49、处处理成:cc = aa+ + b;因因此, 这这段代码持持行后a = 6, b = 7, c = 12。如如果你知道道答案,或或猜出正确确答案,做做得好。如如果你不知知道答案,我我也不把这这个当作问问题。我发发现这个问问题的最大大好处是这这是一个关关于代码编编写风格,代代码的可读读性,代码码的可修改改性的好的的话题。4、设有以以下说明和和定义:ttypeddef uunionn loong ii; innt k5; charr c; DATTE;sttructt datta int cat; DATTE coow; ddoublle doog; too;DATEE maxx;则语句句 pri

50、intf(“%d”,sizzeof(struuct ddate)+sizzeof(max);的执执行结果是是?答 、结果是:52。DDATE是是一个unnion, 变量公公用空间. 里面最最大的变量量类型是iint55, 占占用20个个字节. 所以它的的大小是220datta是一个个struuct, 每个变量量分开占用用空间. 依次为iint4 + DAATE200 + ddoublle8 = 32.所以结果果是 200 + 332 = 52.当当然在某某些16位位编辑器下下, innt可能是是2字节,那么结果果是 innt2 + DATTE10 + dooublee8 = 205、请写出出下

51、列代码码的输出内内容#inncluddemaiin()int a,b,c,d;a=100;b=aa+;cc=+aa;d=110*a+;prrintff(“b,cc,d:%d,%dd,%d”,b,cc,d);retuurn 00;答:100,12,11206、写出下下列代码的的输出内容容#inccludeeint inc(int a)retuurn(+a);int multti(innt*a,int*b,innt*c)retuurn(*c=*aa*b);typeedef int(FUNCC1)(iint iin);ttypeddef iint(FFUNC22) (iint*,int*,intt*

52、);void showw(FUNNC2 ffun,iint aarg1, intt*argg2)INCpp=&innc;innt teemp =p(arrg1);fun(&temmp,&aarg1, argg2);pprinttf(“%dn”,*arrg2);main()int a;shhow(mmultii,10,&a);retuurn 00;答:11107、请找出出下面代码码中的所以以错误说明明:以下代代码是把一一个字符串串倒序,如如“abccd”倒序序后变为“dcbaa”1、#inncludde”sttringg.h”22、maiin()33、4、 chaar*srrc=”hhelloo

53、,worrld”;5、 cchar* desst=NUULL;66、 innt leen=sttrlenn(srcc);7、 desst=(cchar*)mallloc(len);8、 charr* d=destt;9、 charr* s=srclen;10、 whiile(llen!=0)111、 dd+=ss;122、 prrintff(“%ss”,deest);13、 retuurn 00;14、答:方法11:intt maiin()charr* srrc = “helllo,wworldd”;innt leen = strllen(ssrc);charr* deest = (chhar

54、*)mallloc(llen+11);/要为00分配一个个空间chhar* d = destt;chaar* ss = &srclen-1;/指向最最后一个字字符whiile( len != 0 )*d+=*s;*d = 0;/尾部要要加0pprinttf(“%sn”,desst);ffree(destt);/ 使用完完,应当释释放空间,以以免造成内内存汇泄露露retuurn 00;方法2:#inccludee #inncludde maain()charr strr=”helllo,woorld”;intt lenn=strrlen(str);chaar t;for(int i=0; it=

55、sttri;strri=strlen-i-1; sttrleen-i-1=tt;prinntf(%s,str);retturn 0;8、请问下下面程序有有什么错误误?intt a660225010000,i,j,k;for(k=0;k=11000;k+)for(j=0;j2550;j+)foor(i=0;i60;ii+)aaijkk=0;答案:把把循环语句句内外换一一下9、请问下下面程序会会出现什么么情况?. #deefinee Maxx_CB 500vvoid LmiQQueryyCSmdd(Strruct MSgCCB * pmsgg)unsiignedd chaar uccCmdNNum

56、;.for(uucCmddNum=0;uccCmdNNumMMAX_CCB;UCCCMDNNUM+).;答案:死死循环10、以下下3个有什什么区别cchar * coonst p; /常量指指针,p的的值不可以以修改chhar cconstt * pp;/指指向常量的的指针,指指向的常量量值不可以以改connst cchar *p; /和cchar consst *pp11、写出出下面的结结果chaar sttr1 = abc;chaar sttr2 = abc;constt chaar sttr3 = abc;connst cchar str44 = abbc;constt chaar *s

57、str5 = aabc;consst chhar *str66 = abc;char *strr7 = abcc;chhar *str88 = abc;cout ( strr1 = strr2 ) eendl;coutt ( sttr3 = sttr4 ) endll;couut ( sstr5 = sstr6 ) enddl;coout ( str77 = str88 ) enndl;结果是:00 0 11 1解答答:strr1,sttr2,sstr3,str44是数组变变量,它们们有各自的的内存空间间;而sttr5,sstr6,str77,strr8是指针针,它们指指向相同的的常量区域域。

58、12、以下下代码中的的两个siizeoff用法有问问题吗?vvoid UppeerCasse( cchar str ) / 将将 strr 中的小小写字母转转换成大写写字母for( sizze_t i=0; iiff( aa=sstrii & strri=z )sttri -= (a-A );charr strr = aBBcDe;couut sttr字符长长度为: sizzeof(str)/sizzeof(str0) eendl;UppeerCasse( sstr );couut strr endll;答:函函数内的ssizeoof有问题题。根据语语法,siizeoff如用于数数组,只能能测

59、出静态态数组的大大小,无法法检测动态态分配的或或外部数组组大小。函函数外的sstr是一一个静态定定义的数组组,因此其其大小为66,函数内内的strr实际只是是一个指向向字符串的的指针,没没有任何额额外的与数数组相关的的信息,因因此sizzeof作作用于上只只将其当指指针看,一一个指针为为4个字节节,因此返返回4。13、写出出输出结果果mainn()int a5=1,2,3,4,5;intt *pttr=(iint *)(&aa+1);prinntf(%d,%d,*(a+11),*(ptr-1);输出:22,5*(a+1)就就是a11,*(ptr-1)就是是a4,执行结结果是2,55&a+11不

60、是首地地址+1,系系统会认为为加一个aa数组的偏偏移,是偏偏移了一个个数组的大大小(本例例是5个iint)iint *ptr=(intt *)(&a+11);则pptr实际际是&(aa5),也就是是a+5原原因如下:&a是数数组指针,其其类型为 int (*)5;而而指针加11要根据指指针类型加加上一定的的值,不同同类型的指指针+1之之后增加的的大小不同同,a是长度度为5的iint数组组指针,所所以要加 5*siizeoff(intt),所以pttr实际是是a5,但是prrt与(&a+1)类型是不不一样的(这点很重重要),所以prrt-1只只会减去ssizeoof(innt*)。a,&a的的地

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论