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

C語言經典面試題匯總與解析:從基礎語法到系統編程

     編輯:關於C

本文匯總了大量經典 C/C++ 面試題,涵蓋指針與內存、數據結構與算法、操作系統原理、網絡協議、併發編程等核心領域,並提供詳細解析,是備戰技術面試的寶貴資料庫。

一、 基礎語法與常見錯誤

1. 緩衝區溢出與字符串處理

// 錯誤:string[10] 存放 "0123456789" 缺少結束符空間
char string[10];
char *str1 = "0123456789";
strcpy(string, str1); // 溢出

// 正確:至少分配 11 字節
char string[11];

核心點:C 字符串以 '\0' 結尾,strcpy 會複製結束符,目標緩衝區必須足夠大。

2. 循環邊界與變量定義

// 錯誤:I 未定義,且循環條件應為 I < 9 留位給 '\0'
for (I = 0; I < 10; I++) str1[I] = 'a';
str1[I] = '\0'; // 缺少結束符賦值

// 正確
int I;
for (I = 0; I < 9; I++) str1[I] = 'a';
str1[I] = '\0';

3. strlen 判斷邊界

// 錯誤:strlen <= 10 允許長度 10 的字符串,複製時會溢出
if (strlen(str1) <= 10) strcpy(string, str1);

// 正確:嚴格小於目標緩衝區大小
if (strlen(str1) < 10) strcpy(string, str1);

二、 關鍵字深度解析

static 的三大用途

  1. 限制作用域:文件級靜態變量/函數僅在本文件可見,避免命名衝突。
  2. 延長生命周期:函數內靜態局部變量只初始化一次,保持值跨越調用。
  3. 默認初始化為 0:未顯式初始化的靜態變量自動為 0/NULL。

const 與 volatile

  • const:聲明只讀變量,編譯器優化時不會修改,可置於只讀存儲區。
  • volatile:告訴編譯器該變量可能被外部(硬件、中斷、其他線程)意外修改,禁止優化缓存,每次必須從內存讀取。

三、 指針與引用(C++)

特性指針引用
初始化可延遲必須在聲明時初始化
重新綁定可指向其他對象綁定後不可改變
空值可為 NULL不存在空引用
sizeof指針大小 (4/8 字節)引用對象大小
多級間接支持 (int **)不支持

四、 內存佈局

  • 全局/靜態變量:數據段(.data/.bss)
  • 局部變量:棧
  • 動態分配:堆
  • 代碼/常量:代碼段/只讀數據段

五、 數據結構與算法

平衡二叉樹 (AVL)

左右子樹均為平衡二叉樹,且左右子樹高度差絕對值 ≤ 1。

冒泡排序時間複雜度

O(n²)

浮點數比較零值

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

單鏈表檢測環入口 (Floyd 判圈)

快指針步長 2,慢指針步長 1,相遇後慢指針回頭,雙指針步長 1 再次相遇即為環入口。

六、 系統編程與操作系統

進程 vs 線程

  • 進程:資源分配基本單位,獨立地址空間,切換開銷大。
  • 線程:調度基本單位,共享進程地址空間,擁有獨立棧,切換開銷小,適合 SMP。

死鎖四必要條件

  1. 互斥條件
  2. 請求保持條件
  3. 不可剝奪條件
  4. 循環等待條件

死鎖處理策略

  • 鴕鳥策略(忽略)
  • 預防策略(破壞四條件之一)
  • 避免策略(銀行家算法)
  • 檢測與解除(資源分配圖)

進程調度算法

FCFS(先來先服務)、優先級調度、時間片輪轉、多級反饋隊列。

七、 網絡協議

TCP/IP 四層模型

應用層、傳輸層、網絡層、網絡接口層(數據鏈路+物理)。

TCP vs UDP

特性TCPUDP
連接性面向連接無連接
可靠性可靠、有序、流控不可靠、無序、無流控
開銷頭部 20+ 字節頭部 8 字節
適用場景文件傳輸、Web、郵件視頻流、DNS、即時遊戲

ARP 協議

將 IP 地址解析為 MAC 地址(物理地址)。

八、 經典編程題

1. 交換兩變量不借助第三變量

a = a + b; b = a - b; a = a - b;
// 或
a ^= b; b ^= a; a ^= b; // 僅限整數類型

2. 判斷 2 的冪次

bool isPowerOfTwo(int x) { return x > 0 && (x & (x - 1)) == 0; }

3. 兩棧實現隊列

入隊 push 入棧 A;出隊時若棧 B 為空,將 A 全部 pop 並 push 入 B,再 pop B。攤還 O(1)。

4. 宏定義 SWAP

#define SWAP(x, y) do { typeof(x) _tmp = (x); (x) = (y); (y) = _tmp; } while(0)

5. 求數組中重複數字 (1..N-1 中一個重複,O(N) 時間 O(1) 空間)

int findDup(int a[], int n) {
    int sum = 0;
    for (int i = 0; i < n; i++) sum += a[i];
    return sum - n*(n-1)/2;
}

九、 位運算技巧

  • x & (x-1):清除最低位的 1(用於統計 1 的個數)。
  • x & (-x):取最低位的 1。
  • x | (x-1):將最低位的 0 置為 1。

十、 企業真題精選

華為

  • 局部變量可與全局同名,局部屏蔽全局;訪問全局需 :: (C++) 或避免同名。
  • extern 引用全局變量,編譯期不報錯,鏈接期解析。
  • 頭文件中定義全局變量需加 static 或僅聲明 extern,定義放在 .c 文件。

微軟亞洲技術中心

  • 虛表實現:編譯器為每個含虛函數的類生成虛函數表,對象含指向虛表的指針 (vptr),多態調用通過 vptr 查表間接調用。
  • 單例模式實現:互斥量、FindWindow、文件鎖、共享內存標志。
  • 鍵盤鉤子:SetWindowsHookEx(WH_KEYBOARD, ...) 攔截並修改按鍵。

思科

  • 宏實現 swap 無臨時變量(利用加減或異或)。
  • 位運算反轉指定區間。

總結

C/C++ 面試考察廣度極大,既要掌握語言底層機制(指針、內存、編譯鏈接),又要熟悉核心數據結構算法、操作系統原理、網絡協議與併發編程。建議以「原理為本,代碼驗證」為學習策略,多動手寫代碼、追蹤汇編、分析內存佈局,方能在面試中游刃有余。

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