經典的CC 的strcpy面試題

2021-05-07 19:10:03 字數 1741 閱讀 3266

1.庫函式strcpy的工作方式

char * strcpy( char *strdest, const char *strsrc )

2.找錯題

試題1:

void test1()

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

試題2:

void test2()

strcpy( string, str1 );

}對試題2,如果面試者指出字元陣列str1不能在陣列內結束可以給3分(結尾必須是/0);如果面試者指出strcpy(string, str1)呼叫使得從str1記憶體起複製到string記憶體起所複製的位元組數具有不確定性可以給7分.

void test3(char* str1)

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

對strlen的掌握,它沒有包括字串末尾的'\0'。

讀者看了不同分值的strcpy版本,應該也可以寫出乙個10分的strlen函式了,

完美的版本為: int strlen( const char *str ) //輸入引數const

return len;

}試題4:

void getmemory( char *p )

void test( void )

試題4,str=nill賦值給*p,則*p也是null,所以兩個指標都還沒有分配位址,形參和實參並沒有結合!函式執行結束後的str仍然為null;經典的一題!

試題5:

char *getmemory( void )

void test( void )

char p = "hello world";

return p;

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

試題6:

void getmemory( char **p, int num )

void test( void )

試題6的getmemory避免了試題4的問題,&str是指標的位址,str為指標指向的地位,要弄清楚這兩個。這樣就能達到形參和實參的結合了。

*p = (char *) malloc( num );

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

if ( *p == null )

試題7:

void test( void )

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

char *str = (char *) malloc(100);

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

str = null;

(提示: //delete乙個指標的時候一定要檢查是否為null,否則是個嚴重的應用程式錯誤.

//由於m_pname是用new 產生的空間所以需要 delete來釋放掉, new的東西都不會自己消除, 需要我們在適合的使用呼叫delete

if(m_pname!=null) {

delete m_pname; //因為它是乙個陣列所以需要用delete

m_pname=null; //將它設定為null 防止再次使用這個指標去訪問原來的位址,原來的位址已經被我們delete了.但編譯器不會幫我們自動清它為null 所以我們自己清.)

經典C C 面試題

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

經典C C 面試題

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

c c 程式設計面試題

c c 程式設計面試題07 c語言 c 程式設計面試題集錦 第七部分 1.介紹一下stl,詳細說明stl如何實現vector.answer stl 標準模版庫,standard template library.它由容器演算法迭代器組成。stl有以下的一些優點 可以方便容易地實現搜尋資料或對資料排序...