C/C++ 筆試、面試題目大彙總2 - 程式人生

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

C/C++ 筆試、面試題目大彙總2. 阿新• • 發佈:2019-01-25 ... 試題2:. 複製程式碼. void test2() { charstring[10],str1[10]; int i; for(i=0; i<10; i++) 程式人生>>C/C++筆試、面試題目大彙總2 C/C++筆試、面試題目大彙總2 阿新••發佈:2019-01-25 一.找錯題 試題1: void test1() {  charstring[10];  char* str1 ="0123456789";  strcpy( string,str1); }. 試題2: void test2() {  charstring[10],str1[10];  int i;  for(i=0; i<10;i++)  {   str1 ='a';  }  strcpy( string,str1); } 試題3: void test3(char* str1) {  charstring[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[] ="hello world";   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)=4 sizeof(p)=4剖析:   Func(charstr[100])函式中陣列名作為函式形參時,在函式體內,陣列名失去了本身的內涵,僅僅只是一個指標;在失去其內涵的同時,它還失去了其常量特性,可以作自增、自減等操作,可以被修改。

陣列名的本質如下: (1)陣列名指代一種資料結構,這種資料結構就是陣列; 例如: charstr[10]; cout<



請為這篇文章評分?