C/C++ 筆試、面試題目大彙總2 - 程式人生
文章推薦指數: 80 %
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<
延伸文章資訊
- 1C/C++ 笔试、面试题目大汇总2 - CSDN博客
C/C++ 笔试、面试题目大汇总2 ... 对试题2,如果面试者指出字符数组str1不能在数组内结束可以给3分;如果面试者指出strcpy(string,str1)调用使得 ...
- 2C/C++ 筆試、面試題目大彙總2 - 程式人生
C/C++ 筆試、面試題目大彙總2. 阿新• • 發佈:2019-01-25 ... 試題2:. 複製程式碼. void test2() { charstring[10],str1[10]; i...
- 3C/C++ 筆試、面試題目大匯總(五) - 开发者知识库
C/C++ 筆試、面試題目大匯總(五) ; 請寫出 char *p 與“零值”比較的 if 語句。(3分) ; 標准答案:. if (p == NULL). if (p != NULL). 如下...
- 4C/C++筆試、面試題目大匯總(一) (轉貼) - 程式筆記本
C/C++筆試、面試題目大匯總(一) (轉貼). 原文: http://goodfish.blog.hexun.com.tw/7601245_d.html 1.求下面函數的返回值(微軟) int...
- 5C/C++ 笔试、面试题目大汇总
C/C++ 笔试、面试题目大汇总 ... 因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间都好。 (3)使用指针作为函数的参数 ...