C 標準庫函數是系統編程的基石。本文深度解析 exit() 進程終止語義與 memset() 內存填充機制,結合實戰代碼演示常見誤區與最佳實踐。
#includevoid exit(int status);
main 還是任意嵌套函數中調用,進程直接退出。status=0 表示成功,非零 表示失敗(具體值可自定義錯誤類型)。atexit() 註冊的函數(逆序)、調用 C++ 局部靜態對象析構函數、返回狀態碼給父進程/Shell。exit() 永不返回,後續代碼不可達。| 特性 | exit(status) | return status (在 main) |
|---|---|---|
| 作用域 | 整個進程 | 僅 main 函數 |
| 調用位置 | 任意函數 | 僅 main |
| 流刷新 | 是 | 是 |
| atexit 執行 | 是 | 是 |
| C++ 靜態對象析構 | 是 | 是 |
| 局部對象析構 | 否 (棧不展開) | 是 (正常返回展開棧) |
| 場景 | 填充值 | 代碼示例 |
|---|---|---|
| 結構體/數組置零 | 0 | memset(&st, 0, sizeof(st)) |
| 字符數組置特定字符 | 'a', '0' | memset(buf, '0', len) |
| 標志位數組置 0xFF | -1 (即 0xFF) | memset(flags, -1, n) |
| 鏈表節點初始化 | 0 | memset(pNode, 0, sizeof(Node)) |
#include#include int main() { char str[] = "abcde"; printf("原始: %s\n", str); // abcde memset(str, 0, strlen(str)); // 置零(字符串結束符) printf("置零: [%s]\n", str); // 空字符串 memset(str, '0', strlen(str)); // 填充字符 '0' printf("填'0': %s\n", str); // 00000 int arr[3] = {1,2,3}; memset(arr, 0, sizeof(arr)); // 正確置零 int 數組 printf("arr[0]=%d\n", arr[0]); // 0 return 0; }
熟練掌握 exit 與 memset 的語義邊界,是編寫健壯 C/C++ 系統代碼的基本功。