C/C++面試題3

1、/etc/services 定義了網絡服務的端口

2、Linux操作系統包括了3種不同的類型的進程

(1)交互進程:由一個shell啓動的進程,既可以在前臺運行也可以在後臺運行

(2)批處理進程:進程序列,和終端沒有關係

(3)守護進程:Linux啓動時的進程,並且在後臺運行

3、Kill發送指定的信號到相應的進程,不指定信號的將發送SIGTERM(15)讓進程友好的退出 

4、軟件生命週期:從生存到報廢的時間

(1)軟件計劃和可行性探究(問題定義)

(2)需求分析  (確定軟件系統必須做什麼和必須具備哪些功能)

(3)軟件設計(概要設計和詳細設計):根據需求分析的結果,對整個系統框架,數據庫進行設計

(4)編碼

(5)軟件測試(分爲3階段(1)單元測試(2)組裝測試(3)系統測試)

(6)運行和維護(糾錯性和改進性維護)

5、系統調用和庫函數的區別?

(1):系統調用的函數如open和write包含在頭文件unistd.h中,而庫函數調用如fopen和fwrite等包含在頭文件stdio.h中

(2):系統調用通常用於底層文件中,如在驅動程序中對設備文件的操作,庫函數調用通常用於應用程序中對一般文件的操作

(3):系統調用是於操作系統有關的,不可移植,而庫函數調用是與操作系統無關的,可移植性好

6、寫一個標準宏,這個宏輸入兩個參數並返回較小的哪一個:#define MIN(X,Y) (X>Y)?Y:X

7、struct 和class的區別?

(1)默認的繼承訪問權限。struct是public的,class是private的。

(2)struct作爲數據結構的實現體,它默認的數據訪問控制是public的,而class作爲對象的實現體,它默認的成員變量訪問控制是private的。

8、什麼是野指針?如何避免?

野指針:指向不確定地址的指針變量。(即沒有初始化)使用野指針易因內存泄露出現段錯誤。而造成內存泄露的原因有兩個:

1.訪問了沒有權限的內存(平時我們正確使用指針的時候,系統應經將相應的內存分配給用戶,但是如果指向沒有分配的內存,系統會判定我們沒有權限)
2.訪問了已經釋放了的內存。


爲避免使用無效地址訪問內存,一般在申請指針變量時,將指針變量賦0值,在以後的程序設計中,要使用這個指針前,先判斷是否是0值,如果是,則報錯,如果使用某指針完畢,確保其他部分程序誤使用指針時,也可以將這個使用完的指針再次賦0值(NULL)。
因爲野指針主要是因爲我們平時編程習慣造成的,因此我們只能避免野指針的出現,而不能杜絕。(請注意用詞)我們在編程時,做到以下幾點可以有效地避免野指針的出現。
第一,當一個指針沒有指向時,我們一般默認指向NULL。(NULL代表內存的0地址,並且NULL是不允許做任何操作的)


第二,使用malloc分配內存。(在堆空間裏分配內存)
#difine  MAX_SIZE  1024;
char *ptr = (char *) maollc  (sizeof (char) * MAX_SIZE);


請認真研究這樣的表達式的優點,這個表達式在代碼的維護性,擴展性都大大提高了。這方面是我們平時寫代碼時所應該提高的。


使用malloc也是有講究的,我們應該依照下面的流程:
1.分配內存。(分配成功,返回內存的首地址;分配不成功,返回NULL)。
2.檢查是否分配成功(若失敗,則  exit(1) 退出程序)。
3.清空內存中的數據 (malloc分配的空間裏可能存在垃圾值,因此我們需要清空,可以用到memset或bzero 函數)。
4.使用內存。
5.釋放內存(free,這時ptr又變成野指針)。
6.寫成NULL。

9、C語言分配內存的方式有哪些?C語言中常見的內存錯誤有哪些?

1. 從靜態存儲區域分配

內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。例如全局變量,static變量。

2.在棧上創建

在執行函數時,函數內局部變量的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元自動被釋放。棧內存分配運算內置於處理器的指令集中,效率很高,但是分配的內存容量有限。

3.從堆上分配,亦稱動態分配

程序在運行的時候用malloc或new申請任意多少的內存,程序員自己負責在何時用free或delete釋放內存。動態內存的生存期由我們決定,使用非常靈活,但問題也最多。

 

C語言常見的內存錯誤:

1:內存未分配成功,卻使用了它。

方法:在使用之前檢查指針是否爲NULL。

   1)當指針p是函數的參數時,在函數入口處用語句assert(p!=NULL)進行斷言檢查。

   2)當使用malloc或new來申請內存時,應該用if(p != NULL)進行防錯檢查。

 

2:引用了尚未初始化的指針

原因:內存的缺省初始值究竟是什麼並沒有統一的標準,在使用之前都進行初始化。

  1)沒有初始化的觀念。

  2)內存的缺省值是未定義,即垃圾值。

 

3:越界操作內存

原   因:內存分配成功且初始了,但越界操作是不允許的。

例   如:在使用數組時經常發生下標“多1”或“少1”,特別是在for循環語句時。

 

4:忘記釋放內存,造成內存泄漏。

原因:含有這種類型錯誤的函數,每被調用一次,就丟失一塊內存。當內存充足時看不到這種錯誤帶來的影響,當內存耗盡時系統提示:“內存耗盡”。因此,動態內存的申請與釋放必須配對,程序中malloc與free的使用次數要相同。

 

5:釋放了內存卻繼續使用它

原因:對應的情況有2種

   1)返回了“棧內存的指針或引用”,因爲堆棧中的變量在函數結束後自動銷燬。

   2)某塊內存被free後,沒有將指向該內存的指針設置爲NULL,導致產生“野指針”。

10、MMU是什麼?功能是什麼?

MMU是Memory Management Unit的縮寫,中文名是內存管理單元,它是中央處理器(CPU)中用來管理虛擬存儲器、物理存儲器的控制線路,
同時也負責虛擬地址映射爲物理地址,以及提供硬件機制的內存訪問授權,多用戶多進程操作系統。

11、協處理器是做什麼的?ARM核中有多少個協處理器?

協處理器(coprocessor),一種芯片,用於減輕系統微處理器的特定處理任務
ARM 微處理器可支持多達 16 個協處理器,用於各種協處理操作,在程序執行的過程中,每個協處理器只執行鍼對自身的協處理指令,忽略 ARM 處理器和其他協處理器的指令。
ARM 的協處理器指令主要用於 ARM 處理器初始化 ARM 協處理器的數據處理操作,以及在ARM 處理器的寄存器和協處理器的寄存器之間傳送數據,和在 ARM 協處理器的寄存器和存儲器之間傳送數據。 


ARM協處理器包括以下5條:
CDP:協處理器數據操作指令。
LDC:協處理器數據加載指令。
STC:協處理器數據存儲指令。
MCR:ARM處理器寄存器到協處理器寄存器的數據傳送指令。
MRC:協處理器寄存器到ARM處理器寄存器的數據傳送指令

發佈了57 篇原創文章 · 獲贊 10 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章