C/C++ 笔试、面试题目大汇总2 - CSDN博客

文章推薦指數: 80 %
投票人數:10人

C/C++ 笔试、面试题目大汇总2 ... 对试题2,如果面试者指出字符数组str1不能在数组内结束可以给3分;如果面试者指出strcpy(string,str1)调用使得 ... C/C++笔试、面试题目大汇总2 海底小星星 于 2018-05-1413:20:14 发布 123 收藏 1 分类专栏: 面试 面试 专栏收录该内容 37篇文章 0订阅 订阅专栏 继续~~~~~~~~~ 一.找错题 试题1: void  test1(){  char string [ 10 ];  char *  str1  = " 0123456789 " ; strcpy(  string ,str1);}   试题2: void  test2(){  char string [ 10 ],str1[ 10 ];  int  i;  for (i = 0 ;i < 10 ;i ++ ) {  str1  = ' a ' ; } strcpy(  string ,str1);}   试题3: void  test3( char *  str1){  char string [ 10 ];  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(str1)<10),因为strlen的结果未统计’\0’所占用的1个字节。

剖析:  考查对基本功的掌握:  (1)字符串以’\0’结尾;  (2)对数组越界把握的敏感度;  (3)库函数strcpy的工作方式,如果编写一个标准strcpy函数的总分值为10,下面给出几个不同得分的答案:   试题4: void  GetMemory(  char * p){ p  =  ( char * )malloc(  100  );} void  Test(  void  ) {  char * str  =  NULL; GetMemory(str);  strcpy(str,  " helloworld "  ); printf(str);}   试题5: char * GetMemory(  void  ){   char  p[]  = " helloworld " ;   return  p; } void  Test(  void  ){   char * str  =  NULL;  str  =  GetMemory();  printf(str); }   试题6: void  GetMemory(  char ** p,  int  num){  * p  =  ( char * )malloc(num);} void  Test(  void  ){  char * str  =  NULL; GetMemory(  & str,  100  ); strcpy(str,  " hello "  );  printf(str); }   试题7: void  Test(  void  ){  char * str  =  ( char * )malloc(  100  ); strcpy(str,  " hello "  ); free(str);  ...  // 省略的其它语句 } 解答:  试题4传入中GetMemory(char*p)函数的形参为字符串指针,在函数内部修改形参并不能真正的改变传入形参的值,执行完 char*str=NULL;GetMemory(str); 后的str仍然为NULL; 试题5中charp[]="helloworld"; returnp;   的p[]数组为函数内的局部自动变量,在函数返回后,内存已经被释放。

这是许多程序员常犯的错误,其根源在于不理解变量的生存期。

试题6的GetMemory避免了试题4的问题,传入GetMemory的参数为字符串指针的指针,但是在GetMemory中执行申请内存及赋值语句 *p=(char*)malloc(num);后未判断内存是否申请成功,应加上: if(*p==NULL){ ...//进行申请内存失败处理}   试题7存在与试题6同样的问题,在执行char*str=(char*)malloc(100);  后未进行内存是否申请成功的判断;另外,在free(str)后未置str为空,导致可能变成一个“野”指针,应加上: str=NULL; 试题6的Test函数中也未对malloc的内存进行释放。

剖析:  试题4~7考查面试者对内存操作的理解程度,基本功扎实的面试者一般都能正确的回答其中50~60的错误。

但是要完全解答正确,却也绝非易事。

对内存操作的考查主要集中在:1)指针的理解; 2)变量的生存期及作用范围;3)良好的动态内存申请和释放习惯。

再看看下面的一段程序有什么错误: swap(  int *  p1, int *  p2){  int * p;  * p  = * p1;  * p1  = * p2;  * p2  = * p;} 在swap函数中,p是一个“野”指针,有可能指向系统区,导致程序运行的崩溃。

在VC++中DEBUG运行时提示错误“AccessViolation”。

该程序应该改为: swap(  int *  p1, int *  p2){  int  p; p  = * p1;  * p1  = * p2;  * p2  =  p;}      二.内功题 试题1:分别给出BOOL,int,float,指针变量与“零值”比较的if语句(假设变量名为var) 解答:    BOOL型变量:if(!var)    int型变量:if(var==0)    float型变量:    constfloatEPSINON=0.00001;    if((x>=-EPSINON)&&(x<=EPSINON)    指针变量:  if(var==NULL) 剖析:   考查对0值判断的“内功”,BOOL型变量的0判断完全可以写成if(var==0),而int型变量也可以写成if(!var),指针变量的判断也可以写成if(!var),上述写法虽然程序都能正确运行,但是未能清晰地表达程序的意思。

  一般的,如果想让if判断一个变量的“真”、“假”,应直接使用if(var)、if(!var),表明其为“逻辑”判断;如果用if判断一个数值型变量(short、int、long等),应该用if(var==0),表明是与0进行“数值”上的比较;而判断指针则适宜用if(var==NULL),这是一种很好的编程习惯。

  浮点型变量并不精确,所以不可将float变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。

如果写成if(x==0.0),则判为错,得0分。

  试题2:以下为WindowsNT下的32位C++程序,请计算sizeof的值 void  Func(  char  str[ 100 ]){  sizeof (str)  = ? } void * p  =  malloc(  100  ); sizeof  (p)  = ?   解答: sizeof(str)=4sizeof(p)=4剖析:   Func(charstr[100])函数中数组名作为函数形参时,在函数体内,数组名失去了本身的内涵,仅仅只是一个指针;在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。

数组名的本质如下:(1)数组名指代一种数据结构,这种数据结构就是数组; 例如: charstr[10];cout<0.000001&&x转帖地址:http://hi.baidu.com/hikeba/blog/item/68ad9f10a7dd8003213f2ecf.html
 
charstr[]="hello";
char*p1=str;
intn=10;
sizeof(str)=?
sizeof(str)=?
sizeof(str)=?
voidFunc(chars[100])
{
sizeof(s)=?



請為這篇文章評分?