C语言软件工程师笔试题大全.docx
网络平安应具有以下五个方面的特征I保密性:信息不泄我给非授权用户、实体或过程,或供其利用的特性.完整性:数据未经授权不能进行改变的特性.即信息在存储或传检过程中保持不被修改、不被破坏和丧失的特性。可用性:可被授权实体访问并按需求使用的特性,即当街要时能否存取所需的信息.例如网络环境下拒绝效劳、破坏网络和有关系统的正常运行等椰屈于对可用性的攻击:可控性:对信息的传播及内容具有捽制能力.可审查性:出现平安闫题时提供依据与手段第一局部:根本感念及其它问答的1、关键字Sta1.ie的作用是什么?这个简学的问题很少有人能答复完全。在C语言中,关道字S1.aIiC有三个明显的作用:1) .在函数体,一个被声明为附态的变埴在这一函数被调用过程中维持其值不变.2) .在模块内(但在函数体外),一个被小明为解态的变盘可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变盘,3),在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用.那就是,这个函数被限制在声明它的模块的本地范附内使用.本地化数据和代码范围的好处和重要性).2, "ijur与指针的区别毡什么?答、D引用必须被初始化,指针不必,2)引用初始化以后不能被改变,指针可以改变所指的对象.3)不存在指向空值的引用.但是存在指向空值的指针.指针通过某个指针变盘指向一个对象后,对它所指向的变最间接悚作.程序中使用指许,程序的可读性差:而引用本身就是目标变最的别名,对引用的操作就是对目标变量的掾作.流操作符和、赋值操作符=的返回值、指贝构造函数的参数、赋值操作符=的参数、其它情况都推荐使用引用.3, .h头文件中的ifndef/dCfineendif的作用?答:防止该头文件被曳及引用.4、Sinc1.ude与Kinc1.ude*,fi1.e.h的区别?答:前者是从S1.andard1.ibrary的路径寻找和引用fi1.e.h,而后者是从当前工作路径搜寻并引用fi1.e.h,5.描述实时系统的根本特性答:在特定时间内完成特定的任务,实时性与可靠性.6、全局变量和局部变录在内存中是否有区别?如果有,是什么区别?答:全局变琏他存在静态数据区,局部变量在堆枝中。7.什么是平衡二叉树?答:左右于树格是平衡二叉树且左右子树的深度差值的绝对值不大于I.8、堆栈溢出一般是由什么原因导致的?答:1.没有回收垃圾资源2.层次太深的递归调用9、H泡排序算法的时间或杂度是什么?答:0(n2)10、什么函数不能声明为虚函数?答:constructorIk队列和栈有什么区别?答:队列先进先出,栈后进先出12、不能做SWiICh。的参数类型答:SWi1.Ch的参数不能为实型.13、局部变Ift能否和全局变量重名?答:能.局部会屏蔽全局.要用全局变fit需要使用":"同部变盘可以与全局变量同名,在函数内引用这个变瓜时.会用到同名的局部变1上而不会用到全局变量,对于有些编详器而言,在同一个函数内可以定义多个同名的局部变业,比方在两个循环体内都定义一个同名的局部变殖,而那个局部变量的作用域就在那个砧环体内14.如何引用一个已经定义过的全局变盘?答、可以用引用头文件的方式,也可以用extern关罐字,如果用引用头文件方式来引用某个在头文件中声明的全局变量.假定你将那个变名写情了,那么在编译期间会报惜,如果你用extern方式引用时,假定你犯了同样的错误,那么在嫔译期间不会报错,而在连接期间报错.15、全局变眼可不可以定义在可被多个.C文件包含的头文件中?为什么?答、可以,在不同的C文件中以StatiC形式来声明同名全局变朋.可以在不同的C文件中声明同名的全局变量.前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错.16、语句for(:1;)有什么问魄?它是什么意思?答、和<hi1.e(D相同,无眼循环。17、doWhiI。和WhiICdo有什么区别?答、第一个循环一遍再判断,后一个判断以后再砧环。18、Statac全局变St局部变量、函数与普通全局变眼、同部变量、函数答、全局变显(外部变JA)的说明之前再冠以StatiC就构成了静态的全可变瓜.全局变配本身就是静态存储方式,静态全局变妆当然也是静态存储方式。这两科在存储方式上并无不1可,这两者的区别虽在于非伸态全局变显的作用域是整个源程序,当一个源程序由多个源文件祖成时,非衿态的全局变鳍在各个源文件中都是有效的.而静态全局变量则限制了其作用城,即只在定义该变量的就文件内有效.在同一源程序的其它源文件中不能使用它.由于步态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以防止在其它源丈件中引起错误。从以上分析HJ以看出,把同部变用改变为伸态变状后是改变了它的存储方式即改变了它的生存期“把全局变量改变为静态变显后是改变了它的作用域,限制了它的使用范B1.static函数与普通函数作川城不同.仅在本文件.只在当前源文件中使用的函数应该说明为内部函数(Static).内部函数应该在当前海文件中说明和定义.对于可在当前海文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件Static全局知与普通的全局知:有什么区剧:SIaIiC全局变量只初使化一次,防止在其他文件单元中破弓I用;static局部受量和普maHtAEa:StatiC局部变量只被初始化一次,下一次依据卜一次结果值:static函数与普通函数有什么区别:StatiC函数在内存中只有一份,普通函数在每个被网用中维持一份拷贝19、程序的内存分配答:一个由cC+*编许的程序占用的内存分为以下几个局部1.栈区(StaCk)一由漏译器自动分配择放.存放函数的参数值,局部变址的值等.共操作方式类似于数据结构中的栈-2、堆区heap一做由程序员分配林放,若程序员不群放,程序站农时可能由OS回收,注意它与数据结的中的堆是两回事,分配方式倒足类似于锥表,MMo3,全局区静态区(static)-全局变量和静态变fit的存储是放在一块的,初始化的全局变肽和静态变Ift在一块区域.未初始化的全局变仪和未初始化的静态变晶在相邻的另一块区域.程序结束后由系统择放.4、文字常景区一常WM字符申就是放在这里的.程序结束后由系统样放。5、程序代码区一存放函数体的二进制代码例子程序这是一个前辈写的,非常详细/main.CPPinia=0;全局初始化区charp1.:/全局未初始化区main()(inb:栈chars三*abc*;栈char*p2;/栈charp3=<123<156n;/1231560在常用区,p3在栈上。sia1.icintC=0:/全局(静态)初始化区P1.-(char*)ma11oc(10):p2=(char*)ma1.Ioc(20);分配用来得10和20字节的区域就在堆区.StrCPy(P1.J1.23456");/1234560放在常贵区,编译零可能会符它与p3所向"123456”优化成一个地方.20、解择堆和栈的区别答:堆(heap)和栈(SIaCk)的区别<1)申请方式StaCk:由系统自动分配.例如,声明在函数中一个局部变奴intb:系统自动在校中为b开辟空间heap:需要程序员自己申诂,并指明大小,在C中InHIIoC函数如p1.=(char*)ma1.Ioc(IO);在C+中用IMJW运算符,如p2=(char*)maUoc(10):但是注怠p1.、p2本身是在栈中的。(2)申请后系统的响应栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则格报异常提示栈溢出.堆:首先应该知道操作系统有一个记录空闲内存地址的流表,当系统收到程序的申清时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链衣中删除,井将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小.这样.代码中的de1.ete谱句才能正确的择放本内存空间.另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那局部由新放入空闲链表中。(3)申请大小的限制栈:在UindOWS下,栈是向低地址扩展的数据结构.是一块连续的内存的区域.这句话的意见是栈原的地址和栈的最大容ht是系统段先规定好的,在W1.M)OWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数,如果申谢的空间超过校的剩余空间时,将提示OVerfIO-因此,能从栈获得的空间较小,堆:堆是向高地址扩展的数据结构,是不连续的内存区域,这是由于系统是用锥表来存储的空闱内存地址的,自然是不连续的,而锥表的遍历方向是南低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存.由此可%.唯获得的空间比较灵活,也比较大.<4)申请效率的比较:栈:由系统自动分配,速度较快。但程序员是无法控制的。堆:是IhnCn分配的内存.一般速度比较慢.而且容易产生内存碎片,不过用起来最方便.另外,在UIM)O於下,最好的方式是用VirtUa1.AnoC分配内存,他不是在堆,也不毡在栈,而是直接在进程的地址空间中保存一块内存,虽然用起来最不方便。但是速度快,也以灵活。(5)堆和校中的存储内容栈:在函数冏川时.第一个进栈的是主函数中后的下一条指令(函数词用语句的下一条可执行谱句的地址.然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入校的.然后是函数中的局部变fit.注意静态变就是不入栈的。当本次函数词用结束后,局部变理先出栈,然后是参数,呆后栈顶指针指向股开始存的地址,也就是主函数中的下一条指令.程序由该点继续运行.堆:一般跄在堆的头部用一个字节存放堆的大小.堆中的具体内容由程序员安排.(6)存取效率的比较chars1.=*aaaaaaaaaaaaaaa*:aaaaaaaaaaa是在运行时刻赋值的:chars2=bbbbbbbbbbbbbbbbb;而bbbbbbbbbbb是在瑞译时就确定的:但是,在以后的存取中,在栈上的数组比指舒所指向的字符中(例如堆)快.比方:Uinc1.udeVoidmainOchara=1.;charc=m1234567890,:char,p=123-1567890*;a=c1.:a=pi;return;对应的汇编代码10:a=c1.;OtMO10678A4DF1move1,byteptrebp-OFh0(M0106A884DFCmovbyteptrebp-1),c1.1.ka=1.;OCHO106D8B55ECmovedx,dwordptrebp1.1.h0(M0107O8AI2OI11>ova1,byteptredx+1.5FC三ovbyteptreb>-1j,a1.第一神在读取时自接就把字符小中的元泰读到存放器C1.中,而第二种则要先把指针值读到CdX中,在根据cd*读取字符.彩然慢了.21、什么是预嫔译,何时需要预编译?答:预编译又称为预处理,是做些代码文本的替换工作,处理才开头的指令,比方指贝目inc1.ude包含的文件代码,#dcQnc宏定义的普换,条件编译等,就是为编译做的预备工作的阶段,主要处理*开始的预编诉指令,预编译指令指示了在程序正式娟译前就由循译携进行的操作,可以放在程序中的任何位?1.C编译系统在对程序进行通常的编译之前,先进行预处理C类供的H处理功能主要有以下三种:1)宏定义2)文件包含3)条件编译2