C 面試題(一)

2021-07-23 01:51:54 字數 3609 閱讀 2799

記憶體管理

記憶體的分配方式

答:分配方式有三種,

1、 靜態儲存區,是在程式編譯時就已經分配好的,在整個執行期間都存在,如全域性變數、常量。

2、 棧上分配,函式內的區域性變數就是從這分配的,但分配的記憶體容易有限。

3、 堆上分配,也稱動態分配,如我們用new,malloc分配記憶體,用delete,free來釋放的記憶體

new/delete 與 malloc()/free() 的區別?

malloc() 與 free() 是c語言的標準庫函式, new/delete 是c++的運算子, 他們都可以用來申請和釋放記憶體, malloc()和free()不在編譯器控制許可權之內, 不能把建構函式和析構函式的任務強加給他們

記憶體分配的注意事項

用new或malloc分配記憶體時,必須要對此指標賦初值。

用delete 或free釋放記憶體後,必須要將指標指向null

關於malloc/free 和new /delete

malloc/free 是c/c+的記憶體分配符,new /delete是c++的記憶體分配符。

注意:malloc/free是庫函式,new/delete是運算子

malloc/free不能執行建構函式與析構函式,而new/delete可以

new/delete不能在c上執行,所以malloc/free不能被淘汰

兩者都必須要成對使用

c++中可以使用_set_new_hander函式來定義記憶體分配異常的處理

delete與 delete 區別

delete只會呼叫一次析構函式,而delete會呼叫每乙個成員的析構函式。在more effective c++中有更為詳細的解釋:「當delete操作符用於陣列時,它為每個陣列元素呼叫析構函式,然後呼叫operator delete來釋放記憶體。」delete與new配套,delete 與new 配套

memtest *mtest1=new memtest[10];

memtest *mtest2=new memtest;

int *pint1=new int [10];

int *pint2=new int;

deletepint1; //-1-

deletepint2; //-2-

deletemtest1;//-3-

deletemtest2;//-4-

在-4-處報錯。

這就說明:對於內建簡單資料型別,delete和delete功能是相同的。對於自定義的複雜資料型別,delete和delete不能互用。delete刪除乙個陣列,delete刪除乙個指標。簡單來說,用new分配的記憶體用delete刪除;用new分配的記憶體用delete刪除。delete會呼叫陣列元素的析構函式。內部資料型別沒有析構函式,所以問題不大。如果你在用delete時沒用括號,delete就會認為指向的是單個物件,否則,它就會認為指向的是乙個陣列。

new,delete和malloc,free的用法

memtest *mtest1=new memtest[10];

memtest *mtest2=new memtest;

int *pint1=new

int [10];

int *pint2=new

int;

deletepint1;

deletepint2;

malloc和free

char *p = (char *) malloc( 100 )//分配記憶體

if ( *p == null ) //檢視記憶體是否分配成功

free( p ) // 釋放記憶體

p = null

//將記憶體置為空,防止也指標的出現

以下是幾個對於可能出現記憶體洩露的問題

1.

void test1()

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

2.

void test2()

strcpy( string, str1 );

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

3.

void test3(char* str1)

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

4.

void getmemory( char *p )

void test( void )

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

//getmemory( str );

//後的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 )

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

//*p = (char *) malloc( num );後未判斷記憶體是否申請成功,應加上:

//if ( *p == null )

//

7.

void test( void )

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

//str = null

8.

swap( int* p1,int* p2 )

//p是乙個「野」指標,有可能指向系統區,導致程式執行的崩潰

總結:

1.字串是以「\0」結尾的,在拷貝資料的時候,不要忘了陣列

2.strcpy(s1,s2);strcpy函式的意思是:把字串s2中的內容copy到s1中,連字串結束標誌也一起copy,當遇到」\0」作為結束符

3 strlen是計算字串的位元組數,不算』\0』所占用的1個位元組

4 函式內部修改形參並不能真正的改變傳入形參的值

5 函式中的區域性自動變數,在函式返回後,記憶體已經被釋放

6 申請了記憶體應該判斷是否申請成功

7 對於釋放記憶體之後,應該把他置為null,防止也指標的出現

C 面試題(一)

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

C 經典面試題 一

最近看一些面試題,覺得如果自己被問到了,並不能很利落的回答出來。一是從來沒有這個意識,二是沒有認真的梳理下。1.c和c 中struct有什麼區別?1 c 中的struct類似於class,有變數,有建構函式 虛函式等,有繼承,多型等類的特徵 2 c中的struct只有變數,不能有函式,但是可以有函式...

C 面試題集(一)

1.c 中指標的優缺點有哪些 答案 優點 1 提高程式的編譯效率和執行速度。2 通過指標可使用主調函式和被調函式之間共享變數或資料結構,便於實現雙向資料通訊。3 可以實現動態的儲存分配。4 便於表示各種資料結構,編寫高質量的程式。缺點 1 使用未正確初始化的指標導致程式崩潰 2 引用已釋放的指標 3...