




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、c语言经典笔试题(特别全)_2842c语言经典笔试题(特别全)_284250/50c语言经典笔试题(特别全)_2842用预办理指令#define申明一个常数,用以表示1年中有多少秒(忽视闰年问题)#defineSECONDS_PER_YEAR(60*60*24*365)UL写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。#defineMIN(A,B)(A)=(B)(A):(B)嵌入式系统中常常要用到无穷循环,你怎么样用C编写死循环呢?这个问题用几个解决方案。我首选的方案是:while(1)一些程序员更喜爱以下方案:for(;)第三个方案是用gotoLoop:.gotoLoop;5.
2、用变量a给出下边的定义a)一个整型数(Aninteger)b)一个指向整型数的指针(Apointertoaninteger)c)一个指向指针的的指针,它指向的指针是指向一个整型数(Apointertoapointertoaninteger)d)一个有10个整型数的数组(Anarrayof10integers)e)一个有10个指针的数组,该指针是指向一个整型数的(Anarrayof10pointerstointegers)f)一个指向有10个整型数数组的指针(Apointertoanarrayof10integers)g)一个指向函数的指针,该函数有一个整型参数并返回一个整型数(Apointer
3、toafunctionthattakesanintegerasanargumentandreturnsaninteger)h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数(Anarrayoftenpointerstofunctionsthattakeanintegerargumentandreturnaninteger)答案是:inta;/Anintegerint*a;/Apointertoanintegerint*a;/Apointertoapointertoanintegerinta10;/Anarrayof10integersint*a10;/Anar
4、rayof10pointerstointegersint(*a)10;/Apointertoanarrayof10integersint(*a)(int);/Apointertoafunctionathattakesanintegerargumentandreturnsanintegerint(*a10)(int);/Anarrayof10pointerstofunctionsthattakeanintegerargumentandreturnaninteger重点字static的作用是什么?这个简单的问题极罕有人能回答完整。在C语言中,重点字static有三个显然的作用:1).在函数体,一个
5、被申明为静态的变量在这一函数被调用过程中保持其值不变。2).在模块内(但在函数体外),一个被申明为静态的变量能够被模块内所用函数接见,但不可以被模块外其余函数接见。它是一个当地的全局变量。3).在模块内,一个被申明为静态的函数只可被这一模块内的其余函数调用。那就是,这个函数被限制在声明它的模块的当地范围内使用。7重点字const是什么含意?constinta;intconsta;constint*a;int*consta;intconst*aconst;前两个的作用是相同,a是一个常整型数。第三个意味着a是一个指向常整型数的指针(也就是,整型数是不行改正的,但指针能够)。第四个意思a是一个指向
6、整型数的常指针(也就是说,指针指向的整型数是能够改正的,但指针是不行改正的)。最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不行改正的,同时指针也是不行改正的)。假如应试者能正确回答这些问题,那么他就给我留下了一个好印象。重点字volatile有什么含意并给出三个不一样的例子。一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假定这个变量的值了。精准地说就是,优化器在用到这个变量时一定每次都当心地从头读取这个变量的值,而不是使用保存在寄存器里的备份。下边是volatile变量的几个例子:1).并行设施的硬件寄存器(如:状态寄存器)2
7、).一此中止服务子程序中会接见到的非自动变量(Non-automaticvariables)3).多线程应用中被几个任务共享的变量1).一个参数既能够是const还能够是volatile吗?解说为何。2).一个指针能够是volatile吗?解说为何。3).下边的函数有什么错误:intsquare(volatileint*ptr)return*ptr*ptr;Ptr内容可能被改正,没法保证两次获得同一个值,应当先拿出值放入一个变量中,而后经过这个变量来计算9.嵌入式系统老是要用户对变量或寄存器进行位操作。给定一个整型变量a,写两段代码,第一个设置a的bit3,第二个消除a的bit3。在以上两个操
8、作中,要保持其余位不变。#defineBIT3(0 x16)puts(6):puts(6议论下边的代码片断:unsignedintzero=0;unsignedintcompzero=0 xFFFF;/*1scomplementofzero*/只管不像非嵌入式计算机那么常有,嵌入式系统仍是有从堆(heap)中动向分派内存的过程的。那么嵌入式系统中,动向分派内存可能发生的问题是什么?主要有三种种类:内存泄漏、内存碎片和内存崩溃内存崩溃是内存使用最严重的结果,主要原由有数组接见越界、写已经开释的内存、指针计算错误、接见货仓地点越界等等。碎片采集的问题,变量的持行时间等等下边的代码片段的输出是什么,
9、为何?char*ptr;if(ptr=(char*)malloc(0)=NULL)puts(Gotanullpointer);elseputs(Gotavalidpointer);该代码的输出是“Gotavalidpointer。”Typedef在C语言中屡次用以申明一个已经存在的数据种类的同义字。也能够用预办理器做近似的事。比如,思虑一下下边的例子:#definedPSstructs*typedefstructs*tPS;答案是:typedef更好。思虑下边的例子:dPSp1,p2;tPSp3,p4;第一个扩展为structs*p1,p2;上边的代码定义p1为一个指向构造的指,p2为一个实质
10、的构造,这或许不是你想要的。第二个例子正确地定义了p3和p4两个指针。C语言赞同一些令人震撼的构造,下边的构造是合法的吗,假如是它做些什么?inta=5,b=7,c;c=a+b;上边的代码被办理成:c=a+b;所以,这段代码持行后a=6,b=7,c=12。17.找错题试题1:voidtest1()charstring10;char*str1=0123456789;strcpy(string,str1);试题2:voidtest2()charstring10,str110;inti;for(i=0;i10;i+)str1i=a;strcpy(string,str1);试题3:voidtest3(
11、char*str1)charstring10;if(strlen(str1)=10)strcpy(string,str1);解答:试题1字符串str1需要11个字节才能寄存下(包含末端的?0?),而string只有10个字节的空间,strcpy会导致数组越界;对试题2,假如面试者指出字符数组str1不可以在数组内结束能够给3分;假如面试者指出strcpy(string,str1)调用使得从str1内存起复制到string内存起所复制的字节数拥有不确立性能够给7分,在此基础上指出库函数strcpy工作方式的给10分;对试题3,if(strlen(str1)=10)应改为if(strlen(str
12、1)=-epsinon)&(x=”或“=”形式。假如写成if(x=0.0),则判为错,得0分。23:以下为windowsnt下的32位c+程序,请计算sizeof的值voidfunc(charstr100)sizeof(str)=?void*p=malloc(100);sizeof(p)=?解答:,sizeof(str)=4sizeof(p)=4charstr10;coutsizeof(str)endl;24:写一个“标准”宏min,这个宏输入两个参数并返回较小的一个。此外,当你写下边的代码时会发生什么事?least=min(*p+,b);解答:#definemin(a,b)(a)=(b)?(
13、a):(b)min(*p+,b)会产生宏的副作用为何标准头文件都有近似以下的构造?#ifndef_incvxworksh#define_incvxworksh#ifdef_cplusplusexternc#endif/*.*/#ifdef_cplusplus#endif#endif/*_incvxworksh*/解答:头文件中的编译宏#ifndef_incvxworksh#define_incvxworksh#endif的作用是防备被重复引用。为了实现c和c+的混淆编程,c+供给了c连结互换指定符号externc来解决名字般配问题,函数申明前加上externc后,则编译器就会依照c语言的方式将
14、该函数编译为_foo,这样c语言中就能够调用c+的函数了。26编写一个函数,作用是把一个char构成的字符串循环右移n个。比方本来是“abcdefghi如”果n=2,移位后应当是“hiabcdefgh”函数头是这样的:/pstr是指向以0结尾的字符串的指针/steps是要求挪动的nvoidloopmove(char*pstr,intsteps)请填补.解答:正确解答1:voidloopmove(char*pstr,intsteps)intn=strlen(pstr)-steps;chartmpmax_len;strcpy(tmp,pstr+n);strcpy(tmp+steps,pstr);*
15、(tmp+strlen(pstr)=0;strcpy(pstr,tmp);正确解答2:voidloopmove(char*pstr,intsteps)intn=strlen(pstr)-steps;chartmpmax_len;memcpy(tmp,pstr+n,steps);memcpy(pstr+steps,pstr,n);memcpy(pstr,tmp,steps);static重点字起码有以下n个作用:1)函数体内static变量的作用范围为该函数体,不一样于auto变量,该变量的内存只被分派一次,所以其值在下次调用时仍保持前一次的值;2)在模块内的static全局变量能够被模块内所用
16、函数接见,但不可以被模块外其余函数接见;3)在模块内的static函数只可被这一模块内的其余函数调用,这个函数的使用范围被限制在申明它的模块内;const重点字起码有以下n个作用:1)欲阻挡一个变量被改变,能够使用const重点字。在定义该const变量时,往常需要对它进行初始化,因为此后就没有时机再去改变它了;(2)对指针来说,能够指定指针自己为const,也能够指定指针所指的数据为const,或二者同时指定为const;3)在一个函数申明中,const能够修饰形参,表示它是一个输入参数,在函数内部不可以改变其值;4)关于类的成员函数,若指定其为const种类,则表示其是一个常函数,不可以改
17、正类的成员变量;29:请写一个c函数,若办理器是big_endian的,则返回0;假如little_endian的,则返回1解答:intcheckcpu()unionwinta;charb;c;c.a=1;return(c.b=1);堆和栈的差异?栈区(stack)-由编译器自动分派开释,寄存函数的参数值,局部变量的值等。其操作方式近似于数据构造中的栈。堆区(heap)-一般由程序员分派开释,若程序员不开释,程序结束时可能由OS回收。1)从静态储存地划分派。内存在程序编译的时候就已经分派好,这块内存在程序的整个运转时期都存在。比如全局变量,static变量。2)在栈上创立。在履行函数时,函数内
18、局部变量的储存单元都能够在栈上创立,函数履行结束时这些储存单元自动被开释。栈内存分派运算内置于办理器的指令集。3)从堆上分派,亦称动向内存分派。程序在运转的时候用malloc或new申请随意多少的内存,程序员自己负责在何时用free或delete开释内存。动向内存的生计期由程序员决定,使用特别灵巧,但问题也最多。31.struct和class的差异答案:struct的成员默认是公有的,而类的成员默认是私有的。struct和class在其余方面是功能相当的。从感情上讲,大多半的开发者感觉类和构造有很大的差异。感觉上构造只是象一堆缺少封装和功能的开放的内存位,而类就象活的并且靠谱的社会成员,它有智
19、能服务,有坚固的封装屏障和一个优秀定义的接口。既然大多半人都这么以为,那么只有在你的类有极少的方法并且有公有数据(这类事情在优秀设计的系统中是存在的!)时,你或许应当使用struct重点字,不然,你应当使用class重点字。32.#includestdafx.h#defineSQR(X)X*Xintmain(intargc,char*argv)inta=10;intk=2;intm=1;a/=SQR(k+m)/SQR(k+m);printf(%dn,a);return0;这道题目的结果是什么啊?2+1*2+1/2+1*2+1=2+2+0.5+2+1=33.const符号常量;(1)constc
20、har*p(2)charconst*p(3)char*constp说明上边三种描绘的差异;假如const位于星号的左边,则const就是用来修饰指针所指向的变量,即指针指向为常量;假如const位于星号的右边,const就是修饰指针自己,即指针自己是常量。(1)constchar*p一个指向char种类的const对象指针,p不是常量,我们能够改正p的值,使其指向不一样的char,可是不可以改变它指向非char对象,如:constchar*p;charc1=a;charc2=b;p=&c1;/okp=&c2;/ok*p=c1;/error(2)charconst*p(3)char*constp
21、这两个好象是相同的,此时*p能够改正,而p不可以改正。(4)constchar*constp这类是地点及指向对象都不可以改正。下边是C语言中两种if语句判断方式。请问哪一种写法更好?为何?intn;if(n=10)/第一种判断方式if(10=n)/第二种判断方式假如少了个=号,编译时就会报错,减少了犯错的可能行,能够检测出能否少了=写出运转结果:/test2unionVstructXunsignedchars1:2;unsignedchars2:3;unsignedchars3:3;x;unsignedcharc;v;v.c=100;printf(%d,v.x.s3);3/01136.用C+写
22、个程序,如何判断一个操作系统是16位仍是32位的?不可以用sizeof()函数A1:位的系统下,inti=65536;couti;/输出0;inti=65535;couti;/输出-1;位的系统下,inti=65536;couti;/输出65536;inti=65535;cout65536)cout32bitendl;elsecout16bitendl;37.C和C+有什么不一样?从体制上:c是面向过程的(但c也能够编写面向对象的程序);可是,c+编写面向对象的程序比c简单c+是面向对象的,供给了类。从合用的方向:的;llinuxc合适要求代码体积小的,效率高的场合,如嵌入式;核心大多半是c写
23、的,因为它是系统软件,效率要求极高。c+合适更上层的,复杂从名称上也能够看出,c+比c多了+,说明c+是c的超集;那为何不叫c+而叫c+呢,是因为c+比c来说扩大的东西太多了,所以就在c后边放上两个+;于是就成了c+C语言是构造化编程语言,C+是面向对象编程语言。C+重视于对象而不是过程,重视于类的设计而不是逻辑的设计。在不用第三方参数的状况下,互换两个参数的值#includevoidmain()inti=60;intj=50;i=i+j;j=i-j;i=i-j;printf(i=%dn,i);printf(j=%dn,j);方法二:i=j;j=i;i=j;方法三:用加减实现,并且不会溢出a=
24、a+b-(b=a).进度间通讯的方式有?进度间通讯的方式有共享内存,管道,Socket,信息行列,等39structAchart:4;chark:4;unsignedshorti:8;unsignedlongm;sizeof(A)=?(不考虑界限对齐)740给定构造structAchart:4;chark:4;unsignedshorti:8;unsignedlongm;问sizeof(A)=?给定构造structAchart:4;4位chark:4;4位unsignedshorti:8;8unsignedlongm;/位偏移2字节保证4字节对齐;/共8字节下边的函数实此刻一个固定的数上加上一
25、个数,有什么错误,更正intadd_n(intn)staticinti=100;i+=n;returni;答:因为static使得i的值会保存前一次的值。去掉static便可了42unionainta_int1;doublea_double;inta_int2;typedefstructa1;chary;b;classcdoublec_double;b1;aa2;输出coutsizeof(c)j+)&(i+=j)i+=j;答:i=544unsignedshortarray=1,2,3,4,5,6,7;inti=3;*(array+i)=?答:445试编写函数判断计算机的字节储存次序是开序(li
26、ttleendian)仍是降序(bigendian)答:boolIsBigendian()unsignedshortusData=0 x1122;unsignedchar*pucData=(unsignedchar*)&usData;return(*pucData=0 x22);46简述CriticalSection和Mutex的不一样点答:对几种同步对象的总结1.CriticalSection速度快不可以用于不一样进度不可以进行资源统计(每次只好够有一个线程对共享资源进行存取)2.Mutex速度慢可用于不一样进度不可以进行资源统计3.Semaphore速度慢可用于不一样进度可进行资源统计(能
27、够让一个或超出一个线程对共享资源进行存取)4.Event速度慢可用于不一样进度可进行资源统计请指出以下程序中的错误并且改正voidGetMemory(char*p)p=(char*)malloc(100);voidTest(void)char*str=NULL;GetMemory=(str);strcpy(str,helloworld);printf(str);错误-参数的值改变后,不会传回GetMemory其实不可以传达动向内存,Test函数中的strcpy(str,helloworld);将使程序崩溃。str向来都是NULL。改正以下:char*GetMemory()char*p=(cha
28、r*)malloc(100);returnp;voidTest(void)char*str=NULL;str=GetMemory()strcpy(str,helloworld);printf(str);方法二:voidGetMemory2(char*p)变为二级指针.voidGetMemory2(char*p,intnum)*p=(char*)malloc(sizeof(char)*num);48用C写一个输入的整数,倒着输出整数的函数,要求用递归方法;答:voidfun(inta)printf(%d,a%10);a/=10;if(a=0)return;fun(a);49.头文件中的ifnde
29、f/define/endif干什么用?预办理答:防备头文件被重复引用50.include和include“filename.h”有什么差异?答:前者用来包含开发环境供给的库头文件,后者用来包含自己编写的头文件。51.在C+程序中调用被C编译器编译后的函数,为何要加extern“C”申明?答:函数和变量被C+编译后在符号库中的名字与C语言的不一样,被externC修饰的变量和函数是依照C语言方式编译和连结的。因为编译后的名字不一样,C+程序不可以直接调用C函数。C+供给了一个C连结互换指定符号extern“C”来解决这个问题。回答下边的问题(6分)(1).VoidGetMemory(char*p
30、,intnum)*p=(char*)malloc(num);voidTest(void)char*str=NULL;GetMemory(&str,100);strcpy(str,hello);printf(str);请问运转Test函数会有什么样的结果?答:输出“hello”(2).voidTest(void)char*str=(char*)malloc(100);strcpy(str,“hello”);free(str);if(str!=NULL)strcpy(str,“world”);printf(str);请问运转Test函数会有什么样的结果?答:输出“world”(3).char*Ge
31、tMemory(void)charp=helloworld;returnp;voidTest(void)char*str=NULL;str=GetMemory();printf(str);请问运转Test函数会有什么样的结果?答:无效的指针,输出不确立53.编写strcat函数(6分)已知strcat函数的原型是char*strcat(char*strDest,constchar*strSrc);此中strDest是目的字符串,strSrc是源字符串。(1)不调用C+/C的字符串库函数,请编写函数strcat答:char*strcat(char*dst,constchar*src)char*c
32、p=dst;while(*cp)cp+;/*findendofdst*/while(*cp+=*src+);/*Copysrctoendofdst*/return(dst);/*returndst*/(2)strcat能把strSrc的内容连结到strDest,为何还要char*种类的返回值?答:方便赋值给其余变量程序什么时候应当使用线程,什么时候单线程效率高。答:1耗时的操作使用线程,提升应用程序响应2并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的恳求。3多CPU系统中,使用线程提升CPU利用率4改良程序构造。一个既长又复杂的进度能够考虑分为多个线程,成为几个独立或半独立的运转
33、部分,这样的程序会利于理解和改正。其余状况都使用单线程。55.TCP/IP成立连结的过程?(3-wayshake)答:在TCP/IP协议中,TCP协议供给靠谱的连结服务,采纳三次握手成立一个连结。第一次握手:成立连结时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等候服务器确认;第二次握手:服务器收到syn包,一定确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;第三次握手:客户端收到服务器的SYNACK包,向服务器发送确认包ACK(ack=k+1),此包发送完成,客户端和服务器进入E
34、STABLISHED状态,达成三次握手。56.ICMP是什么协议,处于哪一层?答:Internet控制报文协议,处于网络层(IP层)57winsock成立连结的主要实现步骤?答:服务器端:socker()成立套接字,绑定(bind)并监听(listen),用accept()等候客户端连结。客户端:socker()成立套接字,连结(connect)服务器,连结上后使用send()和recv(),在套接字上写读数据,直至数据互换完成,closesocket()封闭套接字。服务器端:accept()发现有客户端连结,成立一个新的套接字,自己从头开始等候连接。该新产生的套接字使用send()和recv
35、()写读数据,直至数据互换完成,closesocket()封闭套接字。58动向连结库的两种方式?答:调用一个DLL中的函数有两种方法:1载入时动向链接(load-timedynamiclinking),模块特别明确调用某个导出函数,使得他们就像当地函数相同。这需要链接时链接那些函数所在DLL的导入库,导入库向系统供给了载入DLL时所需的信息及DLL函数定位。2运转时动向链接(run-timedynamiclinking),运转时能够经过LoadLibrary或LoadLibraryEx函数载入DLL。DLL载入后,模块能够经过调用GetProcAddress获取DLL函数的出口地点,而后就能够
36、经过返回的函数指针调用DLL函数了。这样即可防止导入库文件了59IP组播有那些利处?答:Internet上产生的很多新的应用,特别是高带宽的多媒体应用,带来了带宽的急剧耗费和网络拥堵问题。组播是一种赞同一个或多个发送者(组播源)发送单调的数据包到多个接收者(一次的,同时的)的网络技术。组播能够大大的节俭网络带宽,因为不论有多少个目标地点,在整个网络的任何一条链路上只传递单调的数据包。所以说组播技术的核心就是针对如何节俭网络资源的前提下保证服务质量。描绘及时系统的基本特征在特准时间内达成特定的任务,及时性与靠谱性。全局变量和局部变量在内存中能否有差异?假如有,是什么差异?全局变量储藏在静态数据库
37、,局部变量在货仓。什么是均衡二叉树?左右子树都是均衡二叉树且左右子树的深度差值的绝对值不大于1。货仓溢出一般是由什么原由致使的?没有回收垃圾资源。冒泡排序算法的时间复杂度是什么?时间复杂度是O(n2)。65.Internet采纳哪一种网络协议?该协议的主要层次构造?Tcp/Ip协议主要层次构造为:应用层/传输层/网络层/数据链路层66.Internet物理地点和IP地点变换采纳什么协议?ARP(AddressResolutionProtocol)(地点分析協議)/物理层。67.IP地点的编码分为哪俩部分?IP地点由两部分构成,网络号和主机号。可是是要和“子网掩码”按位与上以后才能划分哪些是网络
38、位哪些是主机位。不可以做switch()的参数种类是:switch的参数不可以为实型。注:一定是整数型常量,包含char,short,int,long等,不可以是浮点数。Intmain()Floata=3;Switch(a)Case3:Printf(“a”);Return0;/errorC2450:switchexpressionoftypefloatisillegal69、局部变量可否和全局变量重名?答:能,局部会障蔽全局。要用全局变量,需要使用:局部变量能够与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,用到全局变量。关于有些编译器而言,在同一个函数内能够定义多个同名的局部变
39、量,在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。而不会比方70、如何引用一个已经定义过的全局变量?答:extern能够用引用头文件的方式,也能够用extern重点字,假如用引用头文件方式来引用某个在头文件中申明的全局变理,假定你将那个变写错了,那么在编译时期会报错,假如你用extern方式引用时,假定你犯了相同的错误,那么在编译时期不会报错,而在连结时期报错。71、全局变量可不可以够定义在可被多个.C文件包含的头文件中?为何?答:能够,在不一样的C文件中以static形式来申明同名全局变量。能够在不一样的C文件中申明同名的全局变量,前提是此中只好有一个初值,
40、此时连结不会犯错。C文件中对此变量赋72、语句for(;1;)有什么问题?它是什么意思?答:无穷循环,和while(1)相同。73、do,while和while,do有什么差异?答:前一个循环一遍再判断,后一个判断此后再循环。74程序的局部变量存在于(货仓)中,全局变量存在于(静态区请数据存在于(堆)中。)中,动向申75、设有以下说明和定义:typedefunionlongi;intk5;charc;DATE;/25structdataintcat;DATEcow;doubledog;too;/37DATEmax;则语句printf(%d,sizeof(structdate)+sizeof(m
41、ax);的履行结果是:_52_6276、行列和栈有什么差异?行列先进先出,栈后进先出77、请找出下边代码中的所以错误说明:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”includestring.hmain()char*src=hello,world;char*dest=NULL;intlen=strlen(src);dest=(char*)malloc(len);char*d=dest;char*s=srclen;while(len-!=0)d+=s-;printf(%s,dest);return0;答:intmain()char*src=hello,world;intle
42、n=strlen(src);char*dest=(char*)malloc(len+1);/要为0分派一个空间char*d=dest;char*s=&srclen-1;/指向最后一个字符while(len-!=0)*d+=*s-;*d=0;/尾部要加0printf(%sn,dest);free(dest);/使用完,应当开释空间,免得造成内存汇泄漏return0;用两个栈实现一个行列的功能?要求给出算法和思路!设2个栈为A,B,一开始均为空.入队:将新元素push入栈A;出队:判断栈B能否为空;假如不为空,则将栈A中所有元素挨次pop出并push到栈B;将栈B的栈顶元素pop出;关于一个屡次使
43、用的短小函数,在C语言中应用什么实现,在C+中应用什么实现?c用宏定义,c+用inline软件测试都有那些种类?黑盒:针对系统功能的测试白合:测试函数功能,各函数接口81进度和线程的差异。线程是指进度内的一个履行单元,也是进度内的可调动实体.与进度的差异:调动:线程作为调动和分派的基本单位,进度作为拥有资源的基本单位并发性:不单进度之间能够并发履行,同一个进度的多个线程之间也可并发履行拥有资源:进度是拥有资源的一个独立单位,线程不拥有系统资源,但能够接见隶属于进度的资源.系统开支:在创立或取消进度时,因为系统都要为之分派和回收资源,致使系统的开支显然大于创立或取消线程时的开支。网络编程中设计并
44、发服务器,使用多进度与多线程,请问有什么差异?1,进度:子进度是父进度的复制品。子进度获取父进度数据空间、堆和栈的复制品。2,线程:相对与进度而言,线程是一个更为靠近与履行体的观点,它能够与同进度的其余线程共享数据,但拥有自己的栈空间,拥有独立的履行序列。二者都能够提升程序的并发度,提升程序运转效率和响应时间。线程和进度在使用上各有优弊端:线程履行开支小,但不利于资源管理和保护;而进度正相反。同时,线程合适于在SMP机器上运转,而进度则能够跨机器迁徙。测试方法人工测试:个人复查、抽查和会审机器测试:黑盒测试和白盒测试83Heap与stack的差异。Heap是堆,stack是栈。Stack的空间
45、由操作系统自动分派/开释,Heap上的空间手动分派/开释。Stack空间有限,Heap是很大的自由储存区C中的malloc函数分派的内存空间即在堆上,C+中对应的是new操作符。程序在编译期对变量和函数分派内存都在栈长进行,且程序运转过程中函数调用时参数的传递也在栈长进行一语句实现x能否为2的若干次幂的判断inti=512;(i&(i-1)?false:true);main()inta5=1,2,3,4,5;int*ptr=(int*)(&a+1);printf(%d,%d,*(a+1),*(ptr-1);输出:2,585char*s=AAA;printf(%s,s);s0=B;printf(
46、%s,s);有什么错?AAA是字符串常量。s是指针,指向这个字符串常量,所以申明s的时候就有问题。cosntchar*s=AAA;而后又因为是常量,所以对是s0的赋值操作是不合法的。列举几种进度的同步体制,并比较其优弊端。原子操作信号量体制自旋锁管程,会集,散布式系统进度之间通讯的门路共享储存系统信息传达系统管道:以文件系统为基础进度死锁的原由资源竞争及进度推动次序非法死锁的4个必需条件互斥、恳求保持、不行剥夺、环路死锁的办理鸵鸟策略、预防策略、防止策略、检测与排除死锁操作系统中进度调动策略有哪几种?FCFS(先来先服务),优先级,时间片轮转,多级反应数组和链表的差异数组:数据次序储存,固定大
47、小连表:数据能够随机储存,大小可动向改变93.ISO的七层模型是什么?tcp/udp是属于哪一层?tcp/udp有何优弊端?应用层表示层会话层运输层网络层物理链路层物理层tcp/udp属于运输层TCP服务供给了数据流传输、靠谱性、有效流控制、全双工操作和多路复用技术等。与TCP不一样,UDP其实不供给对IP协议的靠谱体制、流控制以及错误恢复功能等。因为UDP比较简单,UDP头包含极少的字节,比TCP负载耗费少。tcp:供给稳固的传输服务,有流量控制,弊端是包头大,冗余性不好udp:不供给稳固的服务,包头小,开支小94:(void*)ptr.(void*)ptr和和(*(void*)ptr(*(
48、void*)ptr的结果能否相同?此中值是相同的ptr为同一个指针95,要对绝对地点0 x100000赋值,我们能够用(unsignedint*)0 x100000=1234;那么假如想让程序跳转到绝对地点是0 x100000去履行,应当怎么做?*(void(*)()0 x100000)();96分析typedefstructAAintb1:5;intb2:2;AA;voidmain()AAaa;charcc100;strcpy(cc,0123456789abcdefghijklmnopqrstuvwxyz);memcpy(&aa,cc,sizeof(AA);coutaa.b1endl;cou
49、taa.b2endl;答案是-16和97分析:structbitinta:3;intb:2;intc:3;intmain()bits;char*c=(char*)&s;coutsizeof(bit)endl;*c=0 x99;couts.aendls.bendls.cendl;inta=-1;printf(%x,a);return0;输出为何是1001100141-1-4ffffffff98改错:includeintmain(void)int*p;intarr100;p=&arr;return0;解答:搞错了,是指针种类不一样,int*p;/二级指针&arr;/获取的是指向第一维为100的数组
50、的指针includeintmain(void)int*p,*q;intarr100;q=arr;p=&q;return0;99下边这个程序履行后会有什么错误或许成效:#defineMAX255intmain()unsignedcharAMAX,i;/i被定义为unsignedcharfor(i=0;i=MAX;i+)Ai=i;解答:死循环加数组越界接见(C/C+不进行数组越界检查)100structname1charstr;shortx;intnum;structname2charstr;intnum;shortx;sizeof(structname1)=8,sizeof(structname
51、2)=12101读文件file1.txt的内容(比如):123456输出到file2.txt:563412(逆序)2)输出和为一个给定整数的所有组合比如n=55=1+4;5=2+3(相加的数不可以重复)则输出1,4;2,3。注意可增添数组的应用.includeincludeintmain(void)intMAX=10;int*a=(int*)malloc(MAX*sizeof(int);int*b;FILE*fp1;FILE*fp2;fp1=fopen(a.txt,r);if(fp1=NULL)printf(error1);exit(-1);fp2=fopen(b.txt,w);if(fp2=
52、NULL)printf(error2);exit(-1);inti=0;intj=0;while(fscanf(fp1,%d,&ai)!=EOF)i+;j+;if(i=MAX)MAX=2*MAX;b=(int*)realloc(a,MAX*sizeof(int);if(b=NULL)printf(error3);exit(-1);a=b;for(;-j=0;)fprintf(fp2,%dn,aj);fclose(fp1);fclose(fp2);return0;102一个递规反向输出字符串的例子,经典例程.voidinverse(char*p)if(*p=0)return;inverse(p+
53、1);printf(%c,*p);intmain(intargc,char*argv)inverse(abc0);return0;103、用递归算法判断数组aN能否为一个递加数组。递归的方法,记录目前最大的,并且判断目前的能否比这个还大,大则持续,不然返回false结束:boolfun(inta,intn)if(n=1)returntrue;if(n=2)returnan-1=an-2;returnfun(a,n-1)&(an-1=an-2);什么是可重入性?可重入(reentrant)函数能够由多于一个任务并发使用,而不用担忧数据错误。相反,不行重入(non-reentrant)函数不可以由
54、超出一个任务所共享,除非能保证函数的互斥(或许使用信号量,或许在代码的重点部分禁用中止)。可重入函数能够在随意时刻被中止,稍后再持续运转,不会扔掉数据。可重入函数要么使用当地变量,要么在使用全局变量时保护自己的数据。可重入函数:不为连续的调用拥有静态数据。不返回指向静态数据的指针;所有数据都由函数的调用者供给。使用当地数据,或许经过制作全局数据的当地拷贝来保护全局数据。假如一定接见全局变量,记着利用互斥信号量来保护全局变量。绝不调用任何不行重入函数。;106.用最简单的方法实现函数intstrcmp(char*p1,char*p2)intret;/while(*p1&*p2&!(ret=*p1
55、-*p2)while(!(ret=*p1-*p2)&*p1&*p2)p1+;p2+;returnret;intstrcmp(constchar*cs,constchar*ct)registersignedchar_res;while(1)if(_res=*cs-*ct+)!=0|!*cs+)break;return_res;什么是预编译,何时需要预编译:答案:、老是使用不常常变动的大型代码体。、程序由多个模块构成,所有模块都使用一组标准的包含文件和相同的编译选项。状况下,能够将所有包含文件预编译为一个预编译头。在这类108char*constpcharconst*pconstchar*p上述三
56、个有什么差异?答案:char*constp;/常量指针,p的值不可以够改正charconst*p;/指向常量的指针,指向的常量值不可以够改constchar*p;/和charconst*p109charstr1=abc;charstr2=abc;constcharstr3=abc;constcharstr4=abc;constchar*str5=abc;constchar*str6=abc;char*str7=abc;char*str8=abc;cout(str1=str2)endl;cout(str3=str4)endl;cout(str5=str6)endl;cout(str7=str8)
57、endl;结果是:0011str1,str2,str3,str4是数组变量,它们有各自的内存空间;而str5,str6,str7,str8是指针,它们指向相同的常量地区。110以下代码中的两个sizeof用法有问题吗?voidUpperCase(charstr)/将str中的小写字母变换成大写字母for(size_ti=0;isizeof(str)/sizeof(str0);+i)if(a=stri&stri=z)stri-=(a-A);charstr=aBcDe;coutstr字符长度为:sizeof(str)/sizeof(str0)endl;UpperCase(str);coutstr(
58、Y)?(Y):(X)/结尾没有;116。嵌入式系统中常常要用到无穷循环,你怎么用C编写死循环。答案:while(1)或许for(;)117。重点字static的作用是什么?答案:定义静态变量118。重点字const有什么含意?答案:表示常量不可以够改正的变量。119。重点字volatile有什么含意?并举出三个不一样的例子?答案:一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假定这个变量的值了。精准地说就是,优化器在用到这个变量时一定每次都当心地从头读取这个变量的值,而不是使用保存在寄存器里的备份。下边是volatile变量的几个例子:1).并行设施的硬
59、件寄存器(如:状态寄存器)2).一此中止服务子程序中会接见到的非自动变量(Non-automaticvariables)3).多线程应用中被几个任务共享的变量120。int(*s10)(int)答案:int(*s10)(int)表示的是什么啊?函数指针数组,每个指针指向一个intfunc(intparam)的函数。121。有以下表达式:inta=248;intb=4;intconstc=21;constint*d=&a;int*conste=&b;intconst*fconst=&a;请问以下表达式哪些会被编译器严禁?为何?答案:*c=32;d=&b;*d=43;e=34;e=&a;f=0 x
60、321f;*c这是个什么东东,严禁*d说了是const,严禁e=&a说了是const,严禁const*fconst=&a;严禁122互换两个变量的值,不使用第三个变量。即a=3,b=5,互换以后a=5,b=3;答案:有两种解法,一种用算术算法,一种用(异或)a=a+b;b=a-b;a=a-b;ora=ab;b=ab;a=ab;ora=b=a;/只好对int,char.123.c和c+中的struct有什么不一样?答案:c和c+中struct的主要差异是c中的struct不可以够含有成员函数,而c+中的struct能够。c+中struct和class的主要差异在于默认的存取权限不一样,struc
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030中国蛋白棒行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国蔬菜汁饮料行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030中国航空金融行业市场发展分析及前景前景与投资策略研究报告
- 新型显示技术产业投资合同
- 餐饮连锁店统装修合同
- 墓地刻碑聘用合同
- 特殊医疗设备使用患者风险评估及免责协议
- 城市公园使用权转让协议
- 租赁行业设备租赁协议
- 商务活动策划与执行保密协议条款及内容
- 2025年健康管理师考试信息整合试题及答案
- 矮小症的护理措施
- 2024年襄阳市樊城区城市更新投资发展有限公司招聘笔试真题
- 2025年中国酸奶饮品行业市场深度评估及投资战略规划报告
- 新增值税法的变化要点与实务要领
- 2024年电子商务物流挑战试题及答案
- 2025年高考英语二轮复习专题05 阅读七选五(练习)(解析版)
- 门式架搭设方案
- 铁路网络安全知识培训
- 煤矿事故案例警示
- 2025年南通师范高等专科学校高职单招(数学)历年真题考点含答案解析
评论
0/150
提交评论