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

C語言面試必刷 12 題:指針、內存、進制、運行時陷阱深度解析

     編輯:關於C語言

C語言經典面試 12 題:覆蓋指針、緩衝區溢出、調用約定、未定義行為

精選高頻面試題,從標準庫陷阱到底層內存模型,附標準答案與最佳實踐指導。

題目速覽與核心考點

#主題核心考點關鍵詞
1gets() 緩衝區溢出不安全函數棄用fgets 替代
2strcpy() 覆蓋返回地址棧溢出攻擊原理strncpy 防護
3main() 返回類型規範簽名 int main()腳本協作
4內存洩漏生命周期程序結束自動回收 vs 循環洩漏Valgrind
5free() 指針修改陷阱指針算術改變基址保存原始指針
6_exit() vs exit()清理處理程序調用差異atexit
7void* 通用接口類型擦除與結構體封裝泛型編程
8*ptr++ 優先級後綴++ 綁定緊於 **(ptr++)
9修改字符串字面量只讀段寫入導致 SIGSEGV字面量存儲區
10修改 argv[0] 進程名運行時進程元數據修改ps/top 顯示
11返回局部變量地址棧幀失效導致懸空指針輸出參數模式
12printf 參數求值順序右向左求值,左向右輸出調用約定

深度解析精選

題 2:棧溢出攻擊演示


char passwd[10];
strcpy(passwd, argv[1]);  // 無長度檢查
// 輸入超長字符串覆蓋相鄰 flag 變量
// 即使密碼錯誤,flag 非零繞過驗證

防護:strncpy、編譯器 -fstack-protector、地址隨機化 ASLR。

題 5:free 指針算術陷阱


char *ptr = malloc(10);
while (*ptr != 'z') ptr++;  // ptr 移動
free(ptr);  // 傳遞非原始地址 -> 未定義行為

修正:保存 char *orig = ptr; 用於 free。

題 8:運算符優先級陷阱


char *ptr = "Linux";
printf("%c", *ptr++);  // 輸出 'L',ptr 移向 'i'
printf("%c", *ptr);    // 輸出 'i'

規則:後綴 ++ 優先級高於 *,結合方向左到右。

題 11:懸空指針本質


int* inc(int val) {
    int a = val; a++;
    return &a;  // 返回棧上地址
}
// 調用者使用時棧幀已銷毀

修正:傳入輸出參數 void inc(int val, int *out)。

題 12:參數求值順序


int a=10,b=20,c=30;
printf("%d..%d..%d", a+b+c, (b=b*2), (c=c*2));
// 求值順序:右到左 -> c=60, b=40, sum=110
// 輸出順序:左到右 -> 110..40..60

面試準備清單

  • 熟練手寫上述代碼並解釋機制
  • 理解編譯器/運行時/硬件三層交互
  • 掌握 sanitizer 工具:ASan/MSan/TSan/UBSan
  • 知曉 C 標準未定義行為 (UB) 完整列表
  • 能說明緩解方案:編譯器選項、靜態分析、代碼規範

這 12 題覆蓋 C 語言核心難點 80%,吃透即通關系統編程面試核心關。

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