首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言面試題精選詳解 (一):關鍵字、記憶體、指標、演算法與系統基礎

     編輯:關於C語言

一、關鍵字與儲存類別

1. `static` 三大用途

場景效果範例
函數內區域變數靜態儲存期,保持值跨呼叫,僅初始化一次`static int count = 0;`
檔案域變數/函數內部連結,**僅本編譯單元可見**`static int file_var; static void helper();`
類別成員C++ 專屬,全類別共用一份`static int shared;`

2. `const` 與指標的四種組合


const int *p1;     // 指向常數整數,p1 可變,*p1 不可變
int const *p2;     // 同上
int *const p3;     // 常數指標,p3 不可變,*p3 可變
const int *const p4; // 指標與所指皆不可變

**閱讀技巧**:從右向左讀,`const` 修飾左側最近的實體。

3. `volatile` 真正含義

  • 告訴編譯器:「這個變數可能在**編譯器不知情**的情況下改變 (硬體暫存器、信號處理器、多執行緒共享變數)」
  • **禁止**編譯器優化該變數的讀寫 (不缺存、不合併、不重排)。
  • **不保證**原子性、不保證記憶體屏障 (需配合 `_Atomic` / 互斥鎖)。

二、記憶體佈局

C 語言四大區 (C++ 額外有堆/自由存儲區區分)

區域內容管理方式生命週期
程式碼區函數機器碼、常數字面值連結器/載入器程式執行期間
全域/靜態區全域變數、`static` 變數、常數編譯期配置程式執行期間
堆疊區域變數、函數參數、返回位址、暫存器保存編譯器自動 (幀指標)函數呼叫/返回
堆`malloc`/`free` 動態記憶體程式設計師手動分配到釋放

經典題:區域陣列大小導致堆疊溢位


void crash() {
    int huge[1000000];  // 4MB,超過預設 8MB 堆疊限制
}
int main() { crash(); }  // Stack Overflow

**解法**:改 `static` (移至靜態區)、動態分配 `malloc`、或增大堆疊 (`ulimit -s` / 鏈接器選項)。

三、指標進階

1. 指標運算與型別


int a[10];
int *p = a;
p + 1  // 位址 + sizeof(int) = +4 bytes
&a + 1 // 位址 + sizeof(int[10]) = +40 bytes (整個陣列跨越)

2. 函數指標宣告與使用


/* 回傳 int,接受 (int, double) 的函數指標型別 */
typedef int (*FuncPtr)(int, double);

int add(int a, double b) { return a + (int)b; }

int main() {
    FuncPtr f = add;
    printf("%d\n", f(3, 4.5));  // 7
}

3. 陣列指標 vs 指標陣列


int (*p)[10];   // 指向含 10 個 int 陣列的指標
int *q[10];     // 10 個 int 指標的陣列

四、演算法與資料結構

1. 冒泡排序時間複雜度

  • 最壞/平均:O(n²)
  • 最佳 (已排序 + 優化旗標):O(n)
  • 空間:O(1)
  • 穩定

2. 平衡二叉樹 (AVL) 定義

  • 左/右子樹皆為 AVL
  • 左右子樹高度差 |Δh| ≤ 1
  • 查找/插入/刪除:O(log n)

3. 浮點數比較零值


#define EPS 1e-6
if (fabs(x) < EPS) { /* 視為零 */ }

五、系統基礎與網路

1. TCP 三次交握

sequenceDiagram
    Client->>Server: SYN (seq=x)
    Server->>Client: SYN+ACK (seq=y, ack=x+1)
    Client->>Server: ACK (ack=y+1)

2. ARP 協定

IP 位址 → MAC 位址,同一區域網路內廣播請求、單播回應。

3. IP 位址結構

網路號 + 主機號,需配合**子網遮罩**按位 AND 區分。

4. 實時系統特徵

  • **確定性**:在嚴格時間截止點內完成任務
  • **可靠性**:錯誤偵測與恢復機制
  • 硬實時 (Hard) 錯過截止點 = 系統失效;軟實時 可容忍偶爾超時。

六、軟體工程流程

模組功能與介面確定階段

**概要設計** 階段 (High-Level Design) 完成:系統分解為模組、定義模組介面 (API)、資料流、資料庫 schema。

測試分類

類型焦點手法
黑盒測試功能規格等價類劃分、邊界值、狀態轉移
白盒測試內部邏輯語句覆蓋、分支覆蓋、路徑覆蓋
灰盒測試介面+內部資料流測試、介面契約測試

七、華為/微軟/思科 經典追加題

1. 單例模式 (僅一實例運行)

  • 命名互斥體 `CreateMutex` / `pthread_mutex` + 檢查回傳
  • 檔案鎖 `flock` / `fcntl`
  • 共享記憶體旗標

2. 判斷 2 的冪次


bool is_pow2(unsigned x) { return x && !(x & (x - 1)); }

3. 交換兩數無暫存變數


a ^= b; b ^= a; a ^= b;  // 僅限整數,浮點不可

4. 位元計數 (Population Count)


int popcnt(unsigned x) {
    int c = 0;
    while (x) { x &= x - 1; ++c; }  // Brian Kernighan 演算法
    return c;
}

結語

C 語言面試核心在於 **記憶體模型、指標運算、未定義行為邊界、演算法複雜度、系統基礎** 五大支柱。逐題搞懂「為什麼」、「編譯器怎麼做」、「硬體怎麼跑」,才能在白板寫代碼時游刃有餘。建議配合《CSAPP》、《C專家編程》、《Linux核心設計》三大經典深度鑽研。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved