C语言的面试题_带答案2

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1.static有什么用途?(请至少说明两种)1)限制变量的作用域2)设置变量的存储域(堆,主动分配内存也是堆)1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。2)在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。3)在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。补充:一个代码在运行时分为4个区:1)code:代码2)data:全局,静态,常量没初值则值为03)堆:new,malloc分配的内存,需要delete,free释放。如果不释放,则只有等程序运行正常结束时,由操作系统回收,理论上无限大。4)栈:场景信息(函数的参数,返回值,局部变量,临时变量),VC的栈区默认是4M。对大内存的操作,需要放堆区。(没初值则值为无穷大)如:栈区的空间自动分配自动释放。Stedentstu[4*1024*1024]会出问题,应改为:student*stu=newstu[4*1024*1024]释放:delete[]stu;4.全局变量和局部变量在内存中是否有区别?如果有,是什么区别?全局变量储存在静态数据库,局部变量在栈6.堆栈溢出一般是由什么原因导致的?堆栈溢出一般是循环的递归调用导致的,如果使用的大数据结构的局部变量,也可能导致堆栈溢出。没有回收垃圾资源导致的是内存泄露最后内存耗尽。20.不能做switch()的参数类型是:switch的参数不能为实型。(只能是intchar)9.写出floatx与“零值”比较的if语句。if(x0.000001&&x-0.000001)intxif(x==0)if(x!=0)int*p;if(NULL==p)if(NULL!=p)boolx;if(x)if(!x)3.在c语言库函数中将一个字符转换成整型的函数是atol()吗,这个函数的原型是什么?函数名:atol功能:把字符串转换成长整型数函数的原型:longatol(constchar*nptr);程序例:#includestdlib.h#includestdio.hintmain(void){longl;char*str=98765432;l=atol(lstr);printf(string=%sinteger=%ld\n,str,l);return(0);}1.对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现?c用宏定义,c++用inline(内联函数)8.软件测试都有那些种类?黑盒:针对系统功能的测试白合:测试函数功能,各函数接口9.确定模块的功能和模块的接口是在软件设计的那个阶段完成的?概要设计阶段11.unsignedchar*p1;unsignedlong*p2;p1=(unsignedchar*)0x801000;p2=(unsignedlong*)0x810000;请问p1+5=?;p2+5=?;答:p1+5=0x801005;p2+5=0x810014;1.请问下面程序有什么错误?inta[60][250][1000],i,j,k;for(k=0;k1000;k++)for(j=0;j250;j++)for(i=0;i60;i++)a[i][j][k]=0;习惯上应该把循环语句内外换一下----实际上有全部遍历了(编译的时候没错,运行的时候出错,但这个数组太大,如果放在栈中,还是会溢出,要作为全局变量)2.#defineMax_CB500voidLmiQueryCSmd(StructMSgCB*pmsg){unsignedcharucCmdNum;......for(ucCmdNum=0;ucCmdNumMax_CB;ucCmdNum++){......;}死循环(unsignedchar0到255)3.以下是求一个数的平方的程序,请找出错误:#defineSQUARE(a)((a)*(a))inta=5;intb;b=SQUARE(a++);//a被加了2次a=7,b=252、有一个16位的整数,每4位为一个数,写函数求他们的和。解释:整数1101010110110111和1101+0101+1011+0111/*n就是16位的数,函数返回它的四个部分之和*/charSumOfQuaters(unsignedshortn){charc=0;inti=4;do{c+=n&15;n=n4;}while(--i);returnc;}3、两个字符串,s,t;把t字符串接到s字符串尾,s字符串有足够的空间存放t字符串voidconnect(char*s,constchar*t)//strcatstrlenstrcpystrcmpstrchrstrstr{char*q=t;char*p=s;if(q==NULL)return;//1while(*p!='\0')//2{p++;}while(*q!=0){*p=*q;p++;q++;}*p='\0';//3}voidmain(){charp[7]=ABC;charp2[]=EFG;connect(p,p2,3);printf(%s,p);}4、分析下面的代码:char*a=hello;char*b=hello;if(a==b)printf(YES);elseprintf(NO);常量字符串。位于静态存储区,它在程序生命期内恒定不变。如果编译器优化的话,会有可能a和b同时指向同一个hello的。则地址相同。如果编译器没有优化,那么就是两个不同的地址,则不同。对VC,是相同。5、局部变量能否和全局变量重名?答:能,局部会屏蔽全局。要用全局变量,需要使用::;局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。2、如何引用一个已经定义过的全局变量?答:extern例如在某个.cpp中定义了一个全局变量inta=6,可在头文件中加入externinta;然后在需要引用的文件中包含该头文件。或者直接在文件中加入externinta;3、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?答:可以解决方法一:在头文件中用static来定义同名全局变量。另外某个.C文件中定义的非静态全局变量,可以在其头文件中用extern声明,需引用此全局变量的其他.C只需包含此头文件即可。解决方法二:在头文件中使用编译开关:#ifndefA_H#defineA_H。。。。。#endif4、请写出下列代码的输出内容#includestdio.hintmain(void){inta,b,c,d;a=10;b=a++;//1011c=++a;//1212d=10*a++;//12013printf(b,c,d:%d,%d,%d,b,c,d);return0;}答:10,12,1205、static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?答:1)全局变量(外部变量)的说明之前再冠以static就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。2)从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。3)static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件综上所述:static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝6、设有以下说明和定义:typedefunion{longi;intk[5];//20charc;}DATE;structdata{intcat;//4DATEcow;//20doubledog;//8}too;DATEmax;则语句printf(%d,sizeof(structdata)+sizeof(max));的执行结果是:考点:区别struct与union.(一般假定在32位机器上)答:DATE是一个union,变量公用空间.里面最大的变量类型是int[5],占用20个字节.所以它的大小是20.data是一个struct,每个变量分开占用空间.依次为int4+DATE20+double8=32.所以结果是20+32=52.10、请找出下面代码中的所有错误(题目不错,值得一看)说明:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”#includestdio.h#includestdlib.h#includestring.hintmain(){char*src=hello,world;char*dest=NULL;intlen=strlen(src);dest=(char*)malloc(len);char*d=dest;char*s=src[len];while(len--!=0)*d++=*s--;printf(%s,dest);return0;}答:方法1:一共有4个错误;intmain(){char*src=hello,world;intlen=strlen(src);char*dest=(char*)malloc(len+1);//要为分配一个空间char*d=dest;char*s=&src[len-1];//指向最后一个字符while(len--!=0)*d++=*s--;*d=0;//尾部要加’\0’printf(%sn,dest);free(dest);//使用完,应当释放空间,以免造成内存汇泄露dest=NULL;//防止产生野指针return0;}方法2:(方法一需要额外的存储空间,效率不高.)不错的想法#includestdio.h#includestring.hmain(){charstr[]=hello,world;intlen=strlen(str);chart;for(inti=0;ilen/2;i++){t=str[i];str[i]=str[len-i-1];//小心一点str[len-i-1]=t;}printf(%s,str);return0;}3.Heap与stack的差别。答:Heap是堆,stack是栈。Stack的空间由操作系统自动分配/释放,Heap上的空间手动分配/释放。Stack空间有限,Heap是很大的自由存储区C中的malloc函数分配的内存空间即在堆上,C++中对应的是new操作符。程序在编译期对变量和函数分配内存都在栈上进行,且程序运行过程中函数调用时参数的传递也在栈上进行//124816。。。//110100100010000//011111111113一语句实现x是否为2的若干次幂的判断#defineis2*n(x)((x&(x-1))?0:1)int

1 / 24
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功