速看!這8道嵌入式面試題你都會嗎?

知微之见發表於2024-04-11

大家好,我是知微

正逢求職季,分享一些嵌入式面試當中經常會遇到的題目,希望這些乾貨對小夥伴們面試有用哦!

1、介紹一下static關鍵字的作用

在C語言中,static 關鍵字有幾種不同的作用,根據其用途可以大致分類如下:

  • 區域性變數:當static用於函式內的區域性變數時,它使該變數的值在函式呼叫之間持久化,即變數在函式的多次呼叫間不會被重新初始化。它仍然只在宣告它的程式碼塊內可見。
  • 全域性變數:將全域性變數宣告為static,可以限制其連結範圍僅限於定義該變數的檔案內部,也就是說,它不可以被其他檔案透過extern外部宣告所訪問。
  • 函式:如果一個函式被宣告為static,它的連結範圍也將限制在其定義的檔案內。在檔案外部不可見,不能被其他檔案呼叫。
  • 類成員:在物件導向的程式語言中,如C++或Java,static可以用來宣告靜態成員變數和成員函式。靜態成員被該類的所有例項共享,不屬於任何單獨的物件例項。靜態成員函式同樣不屬於任何單個物件,因而沒有this指標,並且只能訪問其類的靜態成員。

2、介紹一下const關鍵字的作用

const 關鍵字在C語言中用來宣告一個常量。被const修飾的變數在定義後不可更改。const可以用於不同的上下文中:

  • 區域性變數:標記函式內的區域性變數為常量,意味著該變數的值在其作用域內不能被改變。
  • 全域性變數:用const修飾全域性變數,可以設定跨檔案的不可變資料。
  • 指標const用於指標時,可以讓指標指向的值或者指標本身的值(指向的地址)不可變。例如,const int *ptr表示指向的int值不可改變,而int * const ptr表示指標ptr的值(地址)不可更改。
  • 函式引數:如果函式的引數被標記為const,意味著傳遞給函式的變數在函式內不會被改變,這對於引用和指標引數尤其重要,因為它告訴使用者這些引數是用來讀取而非修改的。
  • 類成員:在C++中,const可以用於成員函式,表明該成員函式不會修改其所屬的物件。這樣的成員函式可以被一個const物件呼叫。

3、標頭檔案中的 ifndef/define/endif 是幹什麼用的?

#ifndef#define#endif 這三個預處理指令用於防止標頭檔案重複包含。首次包含時,它會定義一個宏,如果該標頭檔案被再次包含,#ifndef 檢測到宏已定義,就會跳過標頭檔案內容,避免重複定義錯誤。

4、用變數a定義

a)一個整型數
b) 一個指向整型數的指標
c) 一個指向指標的的指標,它指向的指標是指向一個整型數
d) 一個有10個整型數的陣列
e) 一個有10個指標的陣列,該指標是指向一個整型數的:
f) 一個指向有10個整型數陣列的指標
g) 一個指向函式的指標,該函式有一個整型引數並返回一個整型數
h) 一個有10個函式指標的陣列,該指標指向一個函式,該函式有一個整型引數並返回一個整型數

a) int a; 
b) int *a;
c) int **a;
d) int a[10]; 
e) int *a[10];
f) int ( *a)[10];
g) int ( *a)(int);
h) int ( *a[10])(int);

5、new和malloc的區別

  1. 型別安全
    • new 是 C++ 中的運算子,它自動計算需要分配的空間大小,並返回正確的型別指標,無需型別轉換。
    • malloc 是 C 語言中的庫函式,它需要手動計算位元組數,並返回 void* 型別,使用時通常需要強制型別轉換。
  2. 構造/解構函式
    • new 在分配記憶體的同時呼叫物件的建構函式,為物件的成員賦予初始值。
    • malloc 僅分配記憶體,不呼叫建構函式,因此不初始化記憶體。
  3. 異常處理
    • new 分配記憶體失敗時會丟擲異常(bad_alloc)。
    • malloc 分配記憶體失敗時返回 NULL
  4. 匹配操作
    • 使用 new 分配的記憶體應該用 delete 來釋放。
    • 使用 malloc 分配的記憶體應該用 free 來釋放。
  5. 記憶體分配方式
    • new 通常分配的是單個物件的記憶體。
    • malloc 用來分配一段指定大小的記憶體區域,適合分配陣列形式的記憶體塊。
  6. 過載
    • new 可以被過載以提供自定義的記憶體分配行為。
    • malloc 不能被過載,因為它是 C 標準庫中的一個函式。

6、嵌入式系統中經常要用到無限迴圈,如何用C編寫死迴圈

  • 使用 while 迴圈:
while(1) {
    // 這裡放置迴圈體內的程式碼
}
  • 使用 for 迴圈:
for(;;) {
    // 這裡放置迴圈體內的程式碼
}
  • 使用 do-while 迴圈:
do {
    // 這裡放置迴圈體內的程式碼
} while(1);
  • 使用 goto 語句:
LOOP_START: 
    // 這裡放置迴圈體內的程式碼
goto LOOP_START;

雖然 goto 方法可以實現

7、隱式轉換規則

如下程式碼的輸出結果是?為什麼?

#include <stdio.h>
int main(void)
{
unsigned int a = 6;
int b = -20;

if (a + b > 6)
printf("a+b大於6\n");
else
printf("a+b小於6\n");

return 0;
}

輸出結果

a+b大於6

解析

因為編譯器會將有符號數b轉換成為一個無符號數,即此處 a+b 等價於 a+(unsigned int)b

該程式執行在32bit環境下,b的值為0xFFFFFFFF-20+1 = 4294967276,即a+b將遠遠大於6。

C 語言按照一定的規則來進行此類運算的轉換,轉換的順序為:

double>float>unsigned long>long>unsigned int>int

8、sizeof和strlen的區別是什麼?

  1. sizeof() 是一個運算子,而 strlen() 是一個函式。
  2. sizeof() 計算的是變數或型別所佔用的記憶體位元組數,而 strlen() 計算的是字串中字元的個數。
  3. sizeof() 可以用於任何型別的資料,而 strlen() 只能用於以空字元 '\0' 結尾的字串。
  4. sizeof() 計算字串的長度,包含末尾的 '\0',strlen() 計算字串的長度,不包含字串末尾的 '\0'。

以上就是今天要分享的內容了!

📢你的每一次👍點贊 ⭐收藏 📝評論,都是我更新的動力,如有錯誤請留言指正,非常感謝!

相關文章