問題:gets(buf) 不檢查長度,輸入超長導致棧溢位。
修正:用 fgets(buf, sizeof(buf), stdin)。
原理:輸入超長字串覆蓋 flag 變數,繞過驗證。
修正:用 strncpy 或 snprintf,加長度檢查。
錯誤:void main() 非標準,應為 int main(void) 並返回狀態碼,供腳本判斷成敗。
程序結束時 OS 會回收所有記憶體,單次 malloc 不 free 不算洩漏。但放在循環/長期運行服務中則是嚴重洩漏。
while(*ptr != 'z') ptr++; 導致 free(ptr) 傳入非原始地址 → 崩潰。
修正:保存原始指針 char *orig = ptr;,最後 free(orig)。
_exit() 直接終止進程,不調用 atexit 註冊函數、不刷新標準 IO 緩衝區。正常退出用 exit() 或 return。
函數簽名 int func(void *ptr) 可接受任意指針。多參數時封裝結構體傳遞。
*ptr++ 等價 *(ptr++):先取值再遞增指針。輸出 L 後 ptr 指向 i。
char *ptr = "Linux"; *ptr = 'T'; 試圖修改唯讀段 → Segfault。
修正:char arr[] = "Linux"; arr[0] = 'T'; 放在棧上可修改。
覆寫 argv[0] 所指記憶體,ps 顯示新名。注意長度不能超過原參數總長。
int* inc(int v){ int a=v; a++; return &a; } 返回棧上地址,函數返回後失效。
修正:傳入外部變數地址 void inc(int *p){ (*p)++; } 或動態分配(調用者負責 free)。
printf("%d..%d..%d", a+b+c, b=b*2, c=c*2); 參數從右至左求值,輸出從左至右。結果 110..40..60。
警告:標準未規定求值順序,嚴禁在參數中修改同一變數。
這 12 題涵蓋緩衝區安全、未定義行為、內存模型、編譯器行為、標準細節。面試不僅要答出結果,更要說出標準依據、風險、修正方案。