錯誤代碼
int i = 10;
int *p = &i;
*p = NULL; // 編譯錯誤:將指針賦值給整數未作類型轉換
錯誤本質
NULL 是 空指針常量,本質是 (void*)0 或 0(視編譯器實現)。
*p 類型為 int,指針類型不能直接賦值給整型變量(反之亦然)。
- 等價於
i = NULL,同樣非法。
正確用法對比
| 場景 | 正確寫法 | 說明 |
| 指針置空 | p = NULL; | 指針變量本身賦值 |
| 整數置零 | *p = 0; 或 i = 0; | 整數變量賦整數字面值 |
| 檢查指針有效 | if (p != NULL) | 指針比較 |
進階:NULL vs 0 vs nullptr (C++11)
- C 標準庫定義
#define NULL ((void*)0),主要用於指針上下文。
- C++98 建議用
0,因 void* 隱式轉換較弱。
- C++11 引入
nullptr(類型 std::nullptr_t),徹底解決重載決議歧義,**現代 C++ 首選 nullptr**。
最佳實踐
- 僅在指針初始化、賦值、比較時使用
NULL/nullptr。
- 整數變量永遠用
0。
- 啟用編譯器警告(
-Wall -Wextra / /W4),可捕獲此類隱式轉換。