初始化指標

指標初始化是避免野指標的好方法。初始化很簡單,與變數的初始化沒有什麼不同。

#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));
}