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

12 道 C 語言面試經典題:指針、內存、陷阱與最佳實踐

     編輯:關於C

Q1: gets() 緩衝區溢位

問題:gets(buf) 不檢查長度,輸入超長導致棧溢位。
修正:用 fgets(buf, sizeof(buf), stdin)。

Q2: strcpy() 破解密碼

原理:輸入超長字串覆蓋 flag 變數,繞過驗證。
修正:用 strncpy 或 snprintf,加長度檢查。

Q3: main() 返回 void

錯誤:void main() 非標準,應為 int main(void) 並返回狀態碼,供腳本判斷成敗。

Q4: 內存洩漏誤區

程序結束時 OS 會回收所有記憶體,單次 malloc 不 free 不算洩漏。但放在循環/長期運行服務中則是嚴重洩漏。

Q5: free() 指針被修改

while(*ptr != 'z') ptr++; 導致 free(ptr) 傳入非原始地址 → 崩潰。
修正:保存原始指針 char *orig = ptr;,最後 free(orig)。

Q6: _exit() 繞過 atexit

_exit() 直接終止進程,不調用 atexit 註冊函數、不刷新標準 IO 緩衝區。正常退出用 exit() 或 return。

Q7: void* 泛型參數

函數簽名 int func(void *ptr) 可接受任意指針。多參數時封裝結構體傳遞。

Q8: *ptr++ 運算子優先級

*ptr++ 等價 *(ptr++):先取值再遞增指針。輸出 L 後 ptr 指向 i。

Q9: 修改字面常量區

char *ptr = "Linux"; *ptr = 'T'; 試圖修改唯讀段 → Segfault。
修正:char arr[] = "Linux"; arr[0] = 'T'; 放在棧上可修改。

Q10: 修改進程名

覆寫 argv[0] 所指記憶體,ps 顯示新名。注意長度不能超過原參數總長。

Q11: 返回局部變數地址

int* inc(int v){ int a=v; a++; return &a; } 返回棧上地址,函數返回後失效。
修正:傳入外部變數地址 void inc(int *p){ (*p)++; } 或動態分配(調用者負責 free)。

Q12: printf 參數求值順序

printf("%d..%d..%d", a+b+c, b=b*2, c=c*2); 參數從右至左求值,輸出從左至右。結果 110..40..60。
警告:標準未規定求值順序,嚴禁在參數中修改同一變數。

總結

這 12 題涵蓋緩衝區安全、未定義行為、內存模型、編譯器行為、標準細節。面試不僅要答出結果,更要說出標準依據、風險、修正方案。

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