Boş gösterici değeri, iyi tanımlanmış bir “hiçbir yerde” temsil eder; Eşit olmayan diğer herhangi bir işaretçi değeri ile karşılaştırmak için garanti edilen geçersiz bir işaretçi değeri. Boş bir işaretçiyi serbest bırakmaya çalışmak tanımsız davranışa neden olur ve genellikle çalışma zamanı hatasına neden olur; bu nedenle, işaretçinin düzenlemeyi kaldırmadan önce NULL olmadığından emin olmak istersiniz. Bir dizi C ve C ++ kütüphane işlevi, bir hata durumunu belirtmek için bir boş gösterici ile döner. Örneğin, malloc
istenen bayt sayısını tahsis edemezse , kütüphane işlevi boş bir işaretçi değeri döndürür ve bu işaretçi ile belleğe erişmeye çalışmak (genellikle) bir çalışma zamanı hatasına neden olur:
int *p = malloc(sizeof *p * N);
p[0] = ...; // this will (usually) blow up if malloc returned NULL
Bu nedenle malloc
, p
NULL değerinin değerini kontrol ederek aramanın başarılı olduğundan emin olmalıyız :
int *p = malloc(sizeof *p * N);
if (p != NULL) // or just if (p)
p[0] = ...;
Şimdi, bir dakika çoraplarını giy, bu biraz inişli çıkış olacak.
Boş bir işaretçi değeri ve bir boş işaretçi sabiti vardır ve ikisinin de aynı olması gerekmez. Boş işaretçi değeri , temel alınan mimarinin "hiçbir yerde" temsil etmek için kullandığı değerdir. Bu değer 0x00000000 veya 0xFFFFFFFF veya 0xDEADBEEF veya tamamen farklı bir şey olabilir. Boş gösterici değerinin her zaman 0 olduğunu varsaymayın .
Boş gösterici sabiti OTOH, her zaman 0 değerli bir integral ifadedir. Bildiğim kadarıyla olarak kaynak kodu söz konusu olduğunda, 0 (ya da herhangi bir entegre sentezleme 0 değerlendirir) boş bir işaretçisini temsil eder. Hem C hem de C ++, NULL makrosunu null işaretçisi sabiti olarak tanımlar. Kodunuz derlendiğinde, boş işaretçi sabiti , oluşturulan makine kodunda uygun boş işaretçi değeri ile değiştirilecektir .
Ayrıca, NULL öğesinin olası geçersiz işaretçi değerlerinden yalnızca biri olduğunu unutmayın ; Bir otomatik işaretçi değişkeni açıkça başlatılmadan, örneğin
int *p;
İlk olarak değişkende depolanan değer belirsizdir ve geçerli veya erişilebilir bir hafıza adresine karşılık gelmeyebilir. Ne yazık ki, NULL olmayan bir işaretçi değerinin kullanılmaya çalışılmadan önce geçerli olup olmadığını söylemenin (taşınabilir) bir yolu yoktur. Bu nedenle, işaretçilerle uğraşıyorsanız, bunları beyan ederken açıkça NULL olarak başlatmanız ve aktif olarak hiçbir şeye işaret etmediklerinde NULL olarak ayarlamak iyi bir fikirdir.
Bunun C'de C ++ 'dan ziyade bir sorun olduğunu unutmayın; idiomatic C ++ bu kadar çok işaretçi kullanmamalı.