嵌入式C语言面试题大全(看这个就够了)_第1页
嵌入式C语言面试题大全(看这个就够了)_第2页
嵌入式C语言面试题大全(看这个就够了)_第3页
嵌入式C语言面试题大全(看这个就够了)_第4页
嵌入式C语言面试题大全(看这个就够了)_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

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

文档简介

1、static有什么用途?(请至少说明两种)1)限制变量的作用域2)设置变量的存储域(堆,主动分配内存也是堆)1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。2)在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。3)在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。4.全局变量和局部变量在内存中是否有区别?如果有,是什么区别?全局变量储存在静态数据库,局部变量在栈6.堆栈溢出一般是由什么原因导致的?堆栈溢出一般是循环的递归调用导致

2、的,如果使用的大数据结构的局部变量也可能导致堆栈溢出。没有回收垃圾资源导致的是内存泄露最后内存耗尽。20.不能做switch()的参数类型是:switch的参数不能为实型。(只能是intchar)9.写出floatx与“零值比较的if语句。if(x-0.000001)3.在c语言库函数中将一个字符转换成整型的函数是atol()吗,这个函数的原型是什么?函数名:atol功能:把字符串转换成长整型数函数的原型:longatol(constchar*nptr);程序例:#include#includeintmain(void)longl;char*str=98765432;l=atol(lstr);

3、printf(string=%sinteger=%ldn,str,l);return(0);对于一个频繁使用的短小函数,在C语言中应用什么实现,在C+中应用什么实现?C用宏定义,c+用inline8.软件测试都有那些种类?黑盒:针对系统功能的测试白合:测试函数功能,各函数接口9.确定模块的功能和模块的接口是在软件设计的那个阶段完成的?概要设计阶段11.unsignedchar*p1;unsignedlong*p2;p1=(unsignedchar*)0 x801000;p2=(unsignedlong*)0 x810000;TOC o 1-5 h z请问pl+5二?;p2+5=?;答:pl+5

4、=0 x801005;p2+5=0 x810014请问下面程序有什么错误?inta602501000,i,j,k;for(k=0;k1000;k+)for(j=0;j250;j+)for(i=0;i60;i+)aijk=0;把循环语句内外换一下(编译的时候没错,运行的时候出错,但这个数组太大,如果放在栈中,还是会溢出,要作为全局变量)#defineMax_CB500voidLmiQueryCSmd(StructMSgCB*pmsg)unsignedcharucCmdNum;for(ucCmdNum=0;ucCmdNum4;while(-i);returnc;3、两个字符串,s,t;把t字符串接

5、到s字符串尾,s字符串有足够的空间存放t字符串voidconnect(char*s,char*t,inti)char*q=t;char*p=s;if(q=NULL)return;while(*p!=0)p+;while(*q!=0)*p=*q;p+;q+;*p=0;voidmain()charp7=ABC;charp2=EFG;connect(p,p2,3);printf(%s,p);4、分析下面的代码char*a=hello;char*b=hello;if(a=b)printf(YES);elseprintf(NO);常量字符串。位于静态存储区,它在程序生命期内恒定不变。如果编译器优化的话,

6、会有可能a和b同时指向同一个hello的。则地址相同。如果编译器没有优化,那么就是两个不同的地址,则不同。对VC,是相同。5、局部变量能否和全局变量重名?答:能,局部会屏蔽全局。要用全局变量,需要使用:;局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。2、如何引用一个已经定义过的全局变量?答:extern例如在某个.cpp中定义了一个全局变量inta,可在头文件中加入externa;然后在需要引用的文件中

7、包含该头文件。或者直接在文件中加入externa;3、全局变量可不可以定义在可被多个文件包含的头文件中?为什么?答:可以在头文件中用tati来定义同名全局变量。另外某个C文件中定义的非静态全局变量可以在其头文件中用xtern声明,需引用此全局变量的其他C只需包含此头文件即可。4、请写出下列代码的输出内容#includeintmain(void)inta,b,c,d;a=10;b=a+;c=+a;d=10*a+;printf(b,c,d:%d,%d,%d,b,c,d)return0;答:10,12,1205、static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么

8、区别?static函数与普通函数有什么区别?答:1)全局变量(外部变量)的说明之前再冠以static就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。2)从以上分析可以看出,把局部变量改变为静态变量

9、后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。3)static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件综上所述:static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;static函数

10、与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝6、设有以下说明和定义:typedefunionlongi;intk5;/20charc;DATE;structdataintcat;/4DATEcow;/20doubledog;/8too;DATEmax;则语句printf(%d,sizeof(structdata)+sizeof(max);的执行结果是:考点:区别struct与union.(般假定在32位机器上)答:DATE是一个union,变量公用空间里面最大的变量类型是int5,占用20个字节.所以它的大小是20.data是一个struct,每个

11、变量分开占用空间依次为int4+DATE20+double8=32.所以结果是20+32=52.10、请找出下面代码中的所有错误(题目不错,值得一看)说明:以下代码是把一个字符串倒序,如“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;答:方法1:一共有4个错误;int

12、main()char*src=hello,world;intlen=strlen(src);char*dest二(char*)malloc(len+l);/要为分配一个空间char*d=dest;char*s=&srclen-1;/指向最后一个字符while(len-!=0)*d+=*s-;*d=0;/尾部要加0printf(%sn,dest);free(dest);/使用完,应当释放空间,以免造成内存汇泄露dest=NULL;/防止产生野指针return0;方法2:(方法一需要额外的存储空间,效率不高.)不错的想法#include#includemain()charstr=hello,wor

13、ld;intlen=strlen(str);chart;for(inti=0;ilen/2;i+)t=stri;stri=strlen-iT;/小心一点strlen-i-1=t;printf(%s,str);return0;Heap与stack的差别。答:Heap是堆,stack是栈。Stack的空间由操作系统自动分配/释放,Heap上的空间手动分配/释放。Stack空间有限,Heap是很大的自由存储区C中的malloc函数分配的内存空间即在堆上,C+中对应的是new操作符。程序在编译期对变量和函数分配内存都在栈上进行,且程序运行过程中函数调用时参数的传递也在栈上进行/124816。/1101

14、00100010000/011111111113一语句实现x是否为2的若干次幕的判断#defineis2*n(x)(x&(x-1)?0:1)intmain(void)intm=512;cout(m&(m-1)?false:true)endl;/即当m中只有一位为1时,才为若干次幕值/考试大提示:若有两个及以上1,则(m&(m-1)不为0,输出0,表示不为2的若干次幕return(0);类比:x为2的若干次幕即表示x中1的位数为1,题目转化为求一个32位数中1的位数,如果为1,则表示该数为2的若干次幕同理也可以利用此规则求一个32位数中1的位数,(m&(m-1)每次可用消除一个1,计算的次数即为

15、1的个数!下述三个有什么区别?char*constp;charconst*pconstchar*p解答:char*constp;/常量指针,p的值不可以修改charconst*p;/指向常量的指针,指向的常量值不可以改constchar*p;/和charconst*p解释下列输出结果charstr1=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=

16、str4)endl;cout(str5=str6)endl;cout(str7=str8)endl;结果是:0011解答:strl,str2,str3,str4是数组变量,它们有各自的内存空间;而str5,str6,str7,str8是指针,它们指向相同的常量区域。节省内存。以下代码中的两个sizeof用法有问题吗?C易#include#includeiostream.hvoidUpperCase(charstr)/将str中的小写字母转换成大写字母inti;for(i=0;isizeof(str)/sizeof(str0);+i)/是指针的大小4,只循环了4次。数组做参数,会退化为指针。可改

17、为strlen(str)if(a=stri&stri=z)stri-=(a-A);/由小写转大写voidmain()charstr=aBcDefg;coutstr字符长度为:sizeof(str)/sizeof(str0)endl;/是数组的大小6UpperCase(str);coutstrendl;答:函数内的sizeof有问题。根据语法,sizeof如用于数组,只能测出静态数组的大小,无法检测动态分配的或外部数组大小。函数外的str是一个静态定义的数组,因此其大小为8,函数内的str实际只是一个指向字符串的指针,没有任何额外的与数组相关的信息,因此sizeof作用于上只将其当指针看,一个指

18、针为4个字节,因此返回4。注意:数组名作为函数参数时,退化为指针.数组名作为sizeof()参数时,数组名不退化,因为sizeof不是函数.一个32位的机器,该机器的指针是多少位232=4G地址总线宽度决定了CPU可以访问的物理地址空间.简单地说就是CPU到底能够使用多大容量的内存.对于386以上的微机系统.地址线的宽度为32位.最多可以直接访问4096MB(4GB)的物理空间.对大多数人来说已经够用了指针是多少位只要看地址总线的位数就行了。80386以后的机子都是32的数据总线。所以指针的位数就是4个字节了。8位处理器、16位处理器、32位处理器和64位处理器,其计数都是8的倍数。它表示一个

19、时钟周期里,处理器处理的二进制代码数。“0”和“1”就是二进制代码,线路上有电信号,则计做1,没有电信号则为0。8位机有8条线路,每个时钟周期有8个电信号,组成一个字节。所以,随8位处理器上升至64位处理器,每个时钟周期传送1个字节到8个字节,关联到时钟速度提高到若干个千兆赫之后,处理器处理信息的能力越来越大。CPU的一次基本运算(and,or,xor,not),能处理/运算几个bits.64bitsdata交由32-bitCPU去运算,得分两次才行.指出下面代码的输出,并解释为什么。(不错,对地址掌握的深入挖潜)main()inta5=1,2,3,4,5;int*ptr=(int*)(&a+

20、l);/指针是数组类型,+1相当于加20.如果是(a+1)是+4printf(“%d%d”,a,ptr);printf(%d,%d,*(a+1),*(ptr-1);输出:124503612450562,5,&a的地址是一样的,但意思不一样,a是数组首地址,也就是a0的地址,&a是对象(数组)首地址,a+1是数组下一元素的地址,即a1,&a+1是下一个对象的地址,即a5.请问以下代码有什么问题:.intmain()chara;char*str=&a;strcpy(str,hello);printf(str);return0;答;没有为str分配内存空间,将会发生异常问题出在将一个字符串复制进一个

21、字符变量指针所指地址。虽然可以正确输出结果,但因为越界进行内在读写而导致程序崩溃。.char*s二AAA;/常量的内容不能改,可定义为数组printf(%s,s);s0=B;printf(%s,s);有什么错?答:AAA是字符串常量。s是指针,指向这个字符串常量,所以声明s的时候就有问题。cosntchar*s=AAA;然后又因为是常量,所以对是s0的赋值操作是不合法的。7用变量a给出下面的定义a)个整型数(Aninteger)b)一个指向整型数的指针(Apointertoaninteger)c)一个指向指针的的指针,它指向的指针是指向一个整型数(Apointertoapointertoani

22、nteger)d)一个有10个整型数的数组(Anarrayof10integers)e)一个有10个指针的数组,该指针是指向一个整型数的(Anarrayof10pointerstointegers)f)一个指向有10个整型数数组的扌旨针(Apointertoanarrayof10integers)g)一个扌旨向函数的扌旨针,该函数有一个整型参数并返回一个整型数(Apointertoafunctionthattakesanintegerasanargumentandreturnsaninteger)h)一个有10个函数指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数(Anar

23、rayoftenpointerstofunctionsthattakeanintegerargumentandreturnaninteger)答案是:Int(*p10)(int);a)inta;/Anintegerb)int*a;/Apointertoanintegerc)int*a;/Apointertoapointertoanintegerd)inta10;/Anarrayof10integerse)int*a10;/Anarrayof10pointerstointegersf)int(*a)10;/Apointertoanarrayof10integersg)int(*a)(int);/

24、Apointertoafunctionathattakesanintegerargumentandreturnsanintegerh)int(*a10)(int);/Anarrayof10pointerstofunctionsthattakeanintegerargumentandreturnaninteger3用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)#defineSECONDS_PER_YEAR(60*60*24*365)UL4写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。#defineMIN(A,B)(A)=(B)?(A):(B)A=B?

25、A:B关键字static的作用是什么?在C语言中,关键字static有三个明显的作用:.在函数体,一个被声明为静态的全局变量在这一函数被调用过程中维持其值不变。(值的保存)2).在模块内(但在函数体外),一个被声明为静态的全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。(限制作用域)3).在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。(限制作用域)6关键字const是什么含意?下面的声明都是什么意思?1constinta;2intconsta;3constint*a;4intconst

26、*a;5int*consta;6intconst*consta;1、constinta;2、intconsta;3、4、内容不可变,指针可变:constint*a;5、内容不可变,指针可变:int*consta;6、内容可变,指针不可变:intconst*consta;8.关键字volatile有什么含意并给出三个不同的例子。一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:1).并行设备的硬件寄

27、存器(如:状态寄存器)2).个中断服务子程序中会访问到的非自动变量(Non-automaticvariables)3).多线程应用中被几个任务共享的变量6.int(*s10)(int)表示的是什么啊int(*s10)(int)函数指针数组,每个指针指向一个intfunc(intparam)的函数。有以下表达式:inta=248;b=4;intconstc=21;constint*d=&a;int*conste=&b;intconstint*constf=&a;请问下列表达式哪些会被编译器禁止?为什么?*c=32;d=&b;*d=43;e=34;e=&a;f=0 x321f;答:*c这是个什么东

28、东,禁止d二&b是很OKe=34不OKe=&a说了是const禁止e的地址不能改constint*constf=&a;禁止f的内容和地址都不能改2交换两个变量的值,不使用第三个变量。即a=3,b=5,交换之后a=5,b=3;答:有两种解法,一种用算术算法,一种用八(异或)a=a+b;b=a-b;a=a-b;ora二ab;/只能对int,char.b=ab;a=ab;2个bit(bitl与bit2异或,结果为0说明它们不同,则bit2异或0可把bitl还原。结果为1说明它们相同,则bit2异或1可把bit1还原。#include#includevoidgetmemory(cha*rp)/函数的参

29、数是局部变量,在这里给它分配内存还在但是P释放了。p=(char*)malloc(100);intmain()char*str=NULL;getmemory(str);strcpy(str,helloworld);printf(%s/n,str);free(str);return0;答:程序崩溃,getmemory中的malloc不能返回动态内存,free()对str操作很危险解决方案1:可改为按引用传递:voidgetmemory(char*&p)解决方案2:返回指针Char*getmemory(char*p)p=(char*)malloc(100);returnp;charszstr10;

30、strcpy(szstr,0123456789);产生什么结果?为什么?答;正常输出,长度不一样,会造成非法的OS,覆盖别的内容.0没保存c指针int*pn;指针数组,每个元素均为指向整型数据的指针。int(*p)n;p为指向一维数组的指针,这个一维数组有n个整型数据。int*p();函数带返回指针,指针指向返回的值。int(*p)();p为指向函数的指针。数组越界问题(这个题目还是有点小险的)面这个程序执行后会有什么错误或者效果:#defineMAX255intmain()unsignedcharAMAX,i;for(i=0;i0)*bdest+=*bsrc+;returndest;用法:#

31、includememory.h功能:由src所指内存区域复制count个字节到dest所指内存区域。说明:src和dest所指内存区域不能重叠,函数返回指向lest的指针。Memset原型:原型:externvoid*memset(void*buffer,charc,intcount);用法:#include功能:把buffer所指内存区域的前count个字节设置成字符c。说明:返回指向buffer的指针。void*memset_su(void*buffer,intc,intcount)assert(buffer!=NULL);char*buffer2=(char*)buffer;while(

32、count-0)*buffer2+=c;returnbuffer;ASSERT0是干什么用的答:ASSERTO是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE(0),程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常用来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。例如,变量n在程序中不应该为0,如果为0可能导致错误,你可以这样写程序:ASSERT(n!=0);k=10/n;ASSERT只有在Debug版本中才有效,如果编译为Release版本则被忽略。assert()的功能类似,它

33、是ANSIC标准中规定的函数,它与ASSERT的一个重要区别是可以用在Release版本中。#include#includevoidmain()intn=1;assert(n!=0);/cc+中使用/ASSERT(n!=0);/什么头文件?printf(sun);1.编写用C语言实现的求n阶阶乘问题的递归算法:答:longintfact(intn)If(n=0|n=1)Return1;ElseReturnn*fact(n-1);5.冒泡排序:#includestdio.hvoidprintArr(intR,intn)inti;for(i=0;in;i+)printf(%d,Ri);printf

34、(n);voidswap(int*a,int*b)intc=*a;*a=*b;*b=c;/4冒泡排序voidmaopaoSort(intR,intn)for(inti=0;in-1;i+)/需要冒泡的次数/*比较的次数for(intj=0;jRj+1)/大的往下沉j+1);swap(&Rj,&R*/for(intj=n-1;ji;j-)/每次需要比较的次数if(RjRj-1)/小的往上冒swap(&Rj,&Rj-1);voidmain()inti;intnum6=0;printf(Pleaseinput6numbers:n);for(i=0;i=-EPSINON)&(x=EPSINON)指针变

35、量:if(NULL=var)试题2:以下为WindowsNT下的32位C+程序,请计算sizeof的值voidFunc(charstr100)sizeof(str)=?void*p=malloc(100);sizeof(p)=?解答:sizeof(str)=4sizeof(p)=4剖析:Func(charstr100)函数中数组名作为函数形参时,在函数体内,数组名失去了本身的内涵,仅仅只是一个指针;在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。数组名的本质如下:数组名指代一种数据结构,这种数据结构就是数组;例如:charstr10;coutsizeof(str)

36、endl;输出结果为10,str指代数据结构char10。数组名可以转换为指向其指代实体的指针,而且是一个指针常量,不能作自增、自减等操作,不能被修改;charstr10;str+;/编译出错,提示str不是左值数组名作为函数形参时,沦为普通指针。WindowsNT32位平台下,指针的长度(占用内存的大小)为4字节,故sizeof(str)、sizeof(p)都为4。3:写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。另外,当你写下面的代码时会发生什么事?least=MIN(*p+,b);解答:#defineMIN(A,B)(A)=(B)?(A):(B)MIN(*p+,b)会产生宏

37、的副作用剖析:(1)谨慎地将宏定义中的“参数”和整个宏用用括弧括起来。所以,严格地讲,下述解答:#defineMIN(A,B)(A)=(B)?(A):(B)#defineMIN(A,B)(A=B?A:B)#defineMIN(A,B)(A)=(B)?(A):(B);都应判0分;(2)防止宏的副作用。宏定义#defineMIN(A,B)(A)二(B)?(A):(B)对MIN(*p+,b)的作用结果是:(*p+)=(b)?(*p+):(b)这个表达式会产生副作用,指针p会作2次+自增操作。/”dfjdosfjkodskf”“dos”100034请编写能直接实现strstr()函数功能的代码。/st

38、rstr(str,substr);在str中找substr,找到后把后面的全部截取返回。#includeiostreamusingstd:cout;usingstd:endl;char*my_strstr(char*str1,char*str2)if(NULL=str1|NULL=str2)throw;char*p=NULL;char*q=NULL;constcharv=0;for(inti=0;v!=str1i;+i)p=&str1i;q=str2;while(v!=*q&*q=*p)+p;+q;if(0=*q)return&str1i;returnNULL;intmain(void)cha

39、ra=;char*p=my_strstr(a,com)7if(NULL=p)coutnotfindendl;elsecoutpendl;p=my_strstr(a,2002);if(NULL=p)coutnotfindendl;elsecoutpendl;写一个函数,检查字符是否是整数,如果是,返回其整数值。(或者:怎样只用4行代码,编写出一个从字符串到长整形的函数?)析:扫描一遍,每次生成对应整数的最高位。一行也就搞定了!/”1234”-a1*1000+2*100+3*10+4O-9“1234”1234longconvert(char*s_string)longs_integer=0;for(intsLen=strlen(s_string),i=0;isLen;s_integer+=(s_stringi+-0)*pow(10,sLen-i-1);returns_integer;12212334152。对1,2,3,4,5这五个数任意取出两个数,列出他们的所有组合voidmain()chara=1,2,3,4,5;for(

温馨提示

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

评论

0/150

提交评论