Nilai penunjuk nol mewakili "tempat" yang didefinisikan dengan baik; itu adalah nilai pointer yang tidak valid yang dijamin untuk membandingkan tidak sama dengan nilai pointer lainnya. Mencoba untuk melakukan dereferensi hasil pointer nol dalam perilaku tidak terdefinisi, dan biasanya akan menyebabkan kesalahan runtime, jadi Anda ingin memastikan pointer tidak NULL sebelum mencoba melakukan dereferensi. Sejumlah fungsi pustaka C dan C ++ akan mengembalikan pointer nol untuk menunjukkan kondisi kesalahan. Misalnya, fungsi pustaka malloc
akan mengembalikan nilai pointer nol jika tidak dapat mengalokasikan jumlah byte yang telah diminta, dan mencoba mengakses memori melalui pointer itu (biasanya) akan menyebabkan kesalahan runtime:
int *p = malloc(sizeof *p * N);
p[0] = ...; // this will (usually) blow up if malloc returned NULL
Jadi kita perlu memastikan malloc
panggilan berhasil dengan memeriksa nilai p
terhadap NULL:
int *p = malloc(sizeof *p * N);
if (p != NULL) // or just if (p)
p[0] = ...;
Sekarang, tunggu sebentar, ini akan sedikit bergelombang.
Ada nilai pointer nol dan konstanta pointer nol , dan keduanya tidak harus sama. Nilai penunjuk nol adalah nilai apa pun yang digunakan arsitektur dasar untuk mewakili "tempat". Nilai ini mungkin 0x00000000, atau 0xFFFFFFFF, atau 0xDEADBEEF, atau sesuatu yang sama sekali berbeda. Jangan berasumsi bahwa pointer nol nilai selalu 0.
Konstanta penunjuk nol , OTOH, selalu merupakan ekspresi integral bernilai 0. Sejauh menyangkut kode sumber Anda , 0 (atau ekspresi integral apa pun yang bernilai 0) mewakili penunjuk nol. Baik C dan C ++ mendefinisikan makro NULL sebagai konstanta penunjuk nol. Ketika kode Anda dikompilasi, null pointer konstan akan diganti dengan nol pointer yang sesuai nilai dalam kode mesin yang dihasilkan.
Perlu diketahui juga bahwa NULL hanyalah salah satu dari banyak nilai pointer yang mungkin tidak valid ; jika Anda mendeklarasikan variabel penunjuk otomatis tanpa menginisialisasi secara eksplisit, seperti
int *p;
nilai awalnya disimpan dalam variabel tidak tentu , dan mungkin tidak sesuai dengan alamat memori yang valid atau dapat diakses. Sayangnya, tidak ada cara (portabel) untuk mengetahui apakah nilai pointer non-NULL valid atau tidak sebelum mencoba menggunakannya. Jadi jika Anda berurusan dengan pointer, biasanya ide yang baik untuk secara eksplisit menginisialisasi mereka ke NULL ketika Anda mendeklarasikannya, dan untuk mengaturnya ke NULL ketika mereka tidak secara aktif menunjuk ke apa pun.
Perhatikan bahwa ini lebih merupakan masalah dalam C daripada C ++; C ++ idiomatis seharusnya tidak menggunakan pointer sebanyak itu.