初始化指標
指標初始化是避免野指標的好方法。初始化很簡單,與變數的初始化沒有什麼不同。
#include <stddef.h>
int main()
{
int *p1 = NULL;
char *p2 = NULL;
float *p3 = NULL;
/* NULL is a macro defined in stddef.h, stdio.h, stdlib.h, and string.h */
...
}
在大多數作業系統中,無意中使用已初始化為 NULL
的指標通常會導致程式立即崩潰,從而可以輕鬆識別問題的原因。使用未初始化的指標通常會導致難以診斷的錯誤。
警告:
取消引用 NULL
指標的結果是未定義的,因此即使這是執行程式的作業系統的自然行為,也不一定會導致崩潰。編譯器優化可能會掩蓋崩潰,導致崩潰發生在原始碼中發生空指標解除引用的點之前或之後,或導致包含空指標解除引用的程式碼部分意外地從程式中刪除。除錯版本通常不會表現出這些行為,但語言標準無法保證這一點。還允許其他意外和/或不期望的行為。
因為 NULL
從不指向變數,分配的記憶體或函式,所以可以安全地用作保護值。
警告:
通常 NULL
定義為 (void *)0
。但這並不意味著分配的記憶體地址是 0x0
。有關更多說明,請參閱 C-faq 以獲取 NULL 指標
請注意,你還可以初始化指標以包含 NULL 以外的值。
int i1;
int main()
{
int *p1 = &i1;
const char *p2 = "A constant string to point to";
float *p3 = malloc(10 * sizeof(float));
}