( Lütfen Yazıyı Okumadan Önce Bu Paragrafı Okuyun. Bu yazıyı okumakla ilgilenen herkesten dikkatlice okumasını istiyorum ve tabii ki tamamen anlayana kadar olumsuz oy vermeyin, teşekkürler.)
Bu artık topluluk wiki'dir, çünkü birisi kavramlardan herhangi birine katılmazsa, lütfen neyin yanlış olduğunu ve nedenini açık ve ayrıntılı bir şekilde açıklayarak değiştirin ve mümkünse lütfen kaynakları belirtin veya çoğaltılabilecek kanıtlar sağlayın.
Cevap
NULL == 0'ın altında yatan faktörler olabilecek diğer birkaç neden burada.
- Sıfırın yanlış olduğu gerçeği, bu nedenle kişi
if(!my_ptr)
yerine doğrudan yapabilirif(my_ptr==NULL)
.
- Başlatılmamış küresel tamsayıların varsayılan olarak tümü sıfır olarak başlatılması ve bu nedenle tüm sıfırların bir göstericisi başlatılmamış olarak kabul edilir.
Burada Diğer Cevaplar Üzerine Bir Kelime Söylemek İstiyorum
Sözdizimsel Şekerden Değil
Sözdizimsel şeker nedeniyle NULL'un sıfır olduğunu söylemek çok mantıklı değil, öyleyse neden uzunluğunu tutmak için dizinin 0 indisini kullanmıyoruz?
Aslında C, iç uygulamaya en çok benzeyen dildir, C'nin sırf sözdizimsel şeker yüzünden sıfırı seçtiğini söylemek mantıklı olur mu? Sıfırı NULL ile eşleştirmek yerine boş bir anahtar kelime (diğer birçok dilin yaptığı gibi) sağlamayı tercih ederler!
Bugün itibariyle sadece sözdizimsel şeker olsa da, daha fazla göstereceğim gibi C dili geliştiricilerinin asıl niyetinin sözdizimsel şeker için olmadığı açıktır.
1) Şartname
Yine de, C spesifikasyonunun sıfır gösterici olarak 0 sabitinden konuştuğu (bölüm 6.3.2.3) ve ayrıca uygulama tanımlanacak şekilde NULL tanımladığı doğru olsa da (C11 spesifikasyonunda bölüm 7.19 ve C99 spesifikasyonunda 7.17), gerçek şu ki, C'nin mucitleri tarafından yazılan "C Programlama Dili" kitabında aşağıdaki bölüm 5.4'te belirtilmiştir:
C, sıfırın hiçbir zaman veriler için geçerli bir adres olmadığını garanti eder, bu nedenle sıfır dönüş değeri, anormal bir olayı işaret etmek için kullanılabilir, bu durumda boşluk yok.
İşaretçi ve tamsayılar birbirinin yerine geçemez, Sıfır tek istisnadır: sabit sıfır bir işaretçiye atanabilir ve bir işaretçi sabit sıfır ile karşılaştırılabilir. Sembolik sabit NULL, bunun bir işaretçi için özel bir değer olduğunu daha açık bir şekilde belirtmek için bir anımsatıcı olarak genellikle sıfır yerine kullanılır. NULL, içinde tanımlanmıştır. Bundan sonra NULL kullanacağız.
Görüldüğü gibi ("sıfır adres" sözcüklerinden) en azından C'nin yazarlarının asıl niyetleri sıfır adresindeydi ve sabit sıfır değil, ayrıca bu alıntıdan belirtimin neden sabit sıfır, büyük olasılıkla sıfır olarak değerlendirilen bir ifadeyi hariç tutmak değil, bunun yerine çevrim yapmadan bir işaretçi bağlamında kullanılmasına izin verilen tek tamsayı sabiti sıfır tamsayı sabitini dahil etmektir.
2) Özet
Spesifikasyon, bir sıfır adresinin sıfır sabitinden farklı olarak ele alınabileceğini açıkça söylemese de, bunun olmadığını ve boş işaretçi sabiti ile uğraşırken bunun uygulama olarak tanımlandığını iddia etmez. NULL tarafından yapar yerine sıfır sabit ve sıfır adresi arasında bir fark olabileceğini sıfır, Şekil olduğu İstem tanımlandığı sabit.
(Bununla birlikte, eğer durum buysa, NULL uygulamasının neden tanımlandığını merak ediyorum, çünkü böyle bir durumda NULL aynı zamanda sabit sıfır olabilir, çünkü derleyici yine de tüm sıfır sabitlerini NULL tanımlı gerçek uygulamaya dönüştürmelidir?)
Ancak bunu gerçek eylemde görmüyorum ve genel platformlarda adres sıfır ve sabit sıfır aynı şekilde ele alınır ve aynı hata mesajını verir.
Dahası, gerçek şu ki, bugünün işletim sistemleri, C'nin NULL göstericisi nedeniyle sıfır adrese erişimi önlemek için aslında ilk sayfanın tamamını (0x0000 ila 0xFFFF aralığı) ayırmaktadır (bkz. Http://en.wikipedia.org/wiki/ Zero_page ve "Windows Via C / C ++, Jeffrey Richter ve Christophe Nasarre (Microsoft Press tarafından yayınlandı)").
Bu nedenle, gerçekten eylemde görüldüğünü iddia eden herkesten platformu, derleyiciyi ve gerçekte yaptığı tam kodu belirtmesini rica ediyorum (spesifikasyondaki belirsiz tanım nedeniyle [gösterdiğim gibi] herhangi bir derleyici ve platform ne isterse yapmakta özgürdür).
Bununla birlikte, görünüşe göre C'nin yazarlarının bunu akıllarında tutmadıkları ve "sıfır adres" den söz ettikleri ve "C'nin hiçbir zaman geçerli bir adres olmadığını garanti ettiği" ve "NULL yalnızca bir anımsatıcı ", orijinal amacının" sözdizimsel şeker "için olmadığını açıkça gösteriyor.
İşletim Sistemi Nedeniyle Değil
Ayrıca, birkaç nedenden dolayı işletim sisteminin sıfır adresine erişimi reddettiğini iddia etmek:
1) C yazıldığında, bu wikipage http://en.wikipedia.org/wiki/Zero_page'de görebileceğiniz gibi, böyle bir kısıtlama yoktu .
2) Gerçek şu ki, C derleyicileri sıfır bellek adresine erişmiştir.
Bu, BellLabs'ın aşağıdaki makalesinde ( http://www.cs.bell-labs.com/who/dmr/primevalC.html )
İki derleyici, bununla nasıl başa çıktıkları konusunda ayrıntılarda farklılık gösterir. Daha öncekinde, başlangıç bir işlevi adlandırarak bulunur; daha sonra, başlangıç 0 olarak alınır. Bu, ilk derleyicinin biz bellek eşlemeli bir makineye sahip olmadan önce yazıldığını gösterir, bu nedenle programın başlangıcı 0 konumunda değildi, oysa ikincinin zamanında, haritalama sağlayan bir PDP-11'imiz vardı.
(Aslında bugün itibariyle (yukarıda wikipedia ve microsoft press'den alıntı yaptığım gibi), sıfır adrese erişimi kısıtlamanın nedeni C'nin NULL işaretçileridir! Yani sonunda tam tersi olduğu ortaya çıktı!)
3) C'nin aynı zamanda işletim sistemleri ve hatta C derleyicileri yazmak için kullanıldığını unutmayın!
Aslında C, onunla birlikte UNIX işletim sistemini yazmak amacıyla geliştirildi ve bu nedenle kendilerini sıfır adresinden kısıtlamaları için hiçbir neden yok gibi görünüyor.
(Donanım) Bilgisayarların Sıfır Adresine Nasıl (Fiziksel Olarak) Erişebildiğine İlişkin Açıklama
Burada açıklamak istediğim bir nokta daha var, sıfır adresini referans almak nasıl mümkün olabilir?
Bir saniyeliğine düşünün, adresler işlemci tarafından alınır ve ardından bellek veriyolunda voltajlar olarak gönderilir, bu daha sonra bellek sistemi tarafından gerçek adrese ulaşmak için kullanılır ve yine de sıfır adresi voltaj olmadığı anlamına gelmez. , bellek sisteminin fiziksel donanımı sıfır adresine nasıl erişiyor?
Cevap, bu adresin varsayılan olduğu ve başka bir deyişle, adres sıfıra her zaman bellek sistemi tarafından bellek veriyolu tamamen kapalı olduğunda ve bu nedenle gerçek bir adres belirtmeden herhangi bir okuma veya yazma talebi (ki sıfır adresli durum) otomatik olarak sıfır adresine erişiyor.
if (p != 0)
içinif (p)
size Java ayırabilir alışkanlık çıkmak gerekecek rağmen, C ve C ++ ortak bir deyim olan.