C C 面試題(四)

2021-08-25 19:20:15 字數 4712 閱讀 6060

寫乙個函式返回1+2+3+…+n的值(假定結果不會超過長整型變數的範圍)

int sum( int n )

剖析:

對於這個題,只能說,也許最簡單的答案就是最好的答案。下面的解答,或者基於下面的解答思路去優化,不管怎麼「折騰」,其效率也不可能與直接return( 1 l + n ) * n / 2相比!

2,3,4一起解答:

void test1()

void test2()

strcpy( string, str1 );

}

void test3(char* str1)

}

解答:

試題2字串str1需要11個位元組才能存放下(包括末尾的』\0』),而string只有10個位元組的空間,strcpy會導致陣列越界;

對試題3,如果面試者指出字元陣列str1不能在陣列內結束可以給3分;如果面試者指出strcpy(string,str1)呼叫使得從str1記憶體起複製到string記憶體起所複製的位元組數具有不確定性可以給7分,在此基礎上指出庫函式strcpy工作方式的給10分;

對試題4,if(strlen(str1)<= 10)應改為if(strlen(str1) < 10),因為strlen的結果未統計』\0』所占用的1個位元組。

剖析:

考查對基本功的掌握:

(1)字串以』\0』結尾;

(2)對陣列越界把握的敏感度;

(3)庫函式strcpy的工作方式,如果編寫乙個標準strcpy函式的總分值為10,下面給出幾個不同得分的答案:

void getmemory( char*p )

void test( void )

char*getmemory( void )

void test( void )

void getmemory( char**p, int num )

void test( void )

void test( void )

解答:

試題5傳入中getmemory(char *p )函式的形參為字串指標,在函式內部修改形參並不能真正的改變傳入形參的值,執行完

char *str = null;

getmemory( str );

後的str仍然為null;

試題6中

char p = 「hello world」;

return p;

的p陣列為函式內的區域性自動變數,在函式返回後,記憶體已經被釋放。這是許多程式設計師常犯的錯誤,其根源在於不理解變數的生存期。

試題7的getmemory避免了試題4的問題,傳入getmemory的引數為字串指標的指標,但是在getmemory中執行申請記憶體及賦值語句

p = (char ) malloc( num );

後未判斷記憶體是否申請成功,應加上:

if ( *p == null )

試題8存在與試題7同樣的問題,在執行

char str = (char ) malloc(100);

後未進行記憶體是否申請成功的判斷;另外,在free(str)後未置str為空,導致可能變成乙個「野」指標,應加上:

str = null;

試題7的test函式中也未對malloc的記憶體進行釋放。

剖析:

試題4~7考查面試者對記憶體操作的理解程度,基本功紮實的面試者一般都能正確的回答其中50~60的錯誤。但是要完全解答正確,卻也絕非易事。

對記憶體操作的考查主要集中在:

1)指標的理解;

2)變數的生存期及作用範圍;

3)良好的動態記憶體申請和釋放習慣。

再看看下面的一段程式有什麼錯誤:

void swap( int* p1,int* p2 )

在swap函式中,p是乙個「野」指標,有可能指向系統區,導致程式執行的崩潰。在vc++中debug執行時提示錯誤「accessviolation」。該程式應該改為:

修改後:

void swap( int* p1,int* p2 )

試題1:分別給出bool,int,float,指標變數 與「零值」比較的 if 語句(假設變數名為var)

解答:

bool型變數:if(!var)

int型變數:if(var==0)

float型變數:

const float epsinon = 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] )

void*p = malloc( 100 );

sizeof ( p ) =?

解答:

sizeof( str ) = 4

sizeof ( p ) = 4

陣列名的本質如下:

(1)陣列名指代一種資料結構,這種資料結構就是陣列;

例如:char str[10];

cout << sizeof(str) << endl;

輸出結果為10,str指代資料結構char[10]。

(2)陣列名可以轉換為指向其指代實體的指標,而且是乙個指標常量,不能作自增、自減等操作,不能被修改;

char str[10];

str++; //編譯出錯,提示str不是左值 

(3)陣列名作為函式形參時,淪為普通指標。

windows nt 32位平台下,指標的長度(占用記憶體的大小)為4位元組,故sizeof( str ) 、sizeof ( p) 都為4。

least = min(*p++, b);

#define min(a,b) ((a) <= (b) ? (a) : (b))
min(*p++, b)會產生巨集的***

試題8:請說出static和const關鍵字盡可能多的作用

解答:

static關鍵字至少有下列n個作用:

(1)函式體內static變數的作用範圍為該函式體,不同於auto變數,該變數的記憶體只被分配一次,因此其值在下次呼叫時仍維持上次的值;

(2)在模組內的static全域性變數可以被模組內所用函式訪問,但不能被模組外其它函式訪問;

(3)在模組內的static函式只可被這一模組內的其它函式呼叫,這個函式的使用範圍被限制在宣告它的模組內;

(4)在類中的static成員變數屬於整個類所擁有,對類的所有物件只有乙份拷貝;

(5)在類中的static成員函式屬於整個類所擁有,這個函式不接收this指標,因而只能訪問類的static成員變數。

const關鍵字至少有下列n個作用:

(1)欲阻止乙個變數被改變,可以使用const關鍵字。在定義該const變數時,通常需要對它進行初始化,因為以後就沒有機會再去改變它了;

(2)對指標來說,可以指定指標本身為const,也可以指定指標所指的資料為const,或二者同時指定為const;

(3)在乙個函式宣告中,const可以修飾形參,表明它是乙個輸入引數,在函式內部不能改變其值;

(4)對於類的成員函式,若指定其為const型別,則表明其是乙個常函式,不能修改類的成員變數;

(5)對於類的成員函式,有時候必須指定其返回值為const型別,以使得其返回值不為「左值」。例如:

const classa operator*(const classa& a1,const classa& a2);

operator*的返回結果必須是乙個const物件。如果不是,這樣的****也不會編譯出錯:

classa a, b, c;

(a * b) = c; // 對a*b的結果賦值

操作(a * b) = c顯然不符合程式設計者的初衷,也沒有任何意義。

剖析:

驚訝嗎?小小的static和const居然有這麼多功能,我們能回答幾個?如果只能回答1~2個,那還真得閉關再好好修煉修煉。

這個題可以考查面試者對程式設計知識的掌握程度是初級、中級還是比較深入,沒有一定的知識廣度和深度,不可能對這個問題給出全面的解答。大多數人只能回答出static和const關鍵字的部分功能。

經典C C 面試題

1.介紹一下stl,詳細說明stl如何實現vector。answer stl 標準模版庫,standard template library 它由容器演算法迭代器組成。stl有以下的一些優點 可以方便容易地實現搜尋資料或對資料排序等一系列的演算法 除錯程式時更加安全和方便 即使是人們用stl在uni...

C C 的面試題

1.new delete malloc free關係 它們都可用於申請動態記憶體和釋放記憶體。malloc 與free 是c c 語言的標準庫函式,new delete 是c 的運算子 關鍵字 注意 new delete 不是庫函式。對於非內部資料型別的物件而言,光用 maloc free 無法滿足...

經典C C 面試題

1.介紹一下stl,詳細說明stl如何實現vector。answer stl 標準模版庫,standard template library 它由容器演算法迭代器組成。stl有以下的一些優點 可以方便容易地實現搜尋資料或對資料排序等一系列的演算法 除錯程式時更加安全和方便 即使是人們用stl在uni...