SORU
3 Mayıs 2010, PAZARTESİ


Neden adresi null işaretçi için kullanılan sıfır mı?

C (veya C için bu madde), işaretçiler özel durumlarda dahi değeri sıfır: I am bilgi için işaretçileri ayarlamak için sıfır sonra azat onların anısına, çünkü bunun anlamı azat işaretçiyi yeniden tehlikeli olmadığından; zaman diyorum malloc döndürür bir işaretçi değeri sıfır olamaz bana hafıza; kullanmak if (p != 0) her zaman emin olmak için geçirilen işaretçi geçerli, vb.

Ama bellek yok 0 sadece bu değil başka geçerli bir adres olarak 0, başlar adresleme beri? Nasıl 0 ise bu durumda null işaretçi işleme için kullanılabilir mi? Neden negatif bir sayı yerine null değil mi?


Düzenleme:

İyi cevaplar bir sürü. Cevapları kendi fikrimi yorumlar olarak ifade söylenenleri özetleyeyim ve topluluk eğer ben yanlış varsa beni düzeltin umuyoruz.

  • Programlama, diğer her şey gibi bir soyutlama. Sadece bir sabit, gerçekten adrese 0 ilgili değil. C 0 x anahtar nullptr ekleyerek bu konuya dikkat çekiyor.

  • Bu adresi soyutlama, sürekli tarafından belirtilen standart C ve derleyici çevirmek için başka bir sayı kadar yapar emin asla eşit bir "gerçek" adres ve eşittir başka bir null işaretçi ise 0 değil en iyi değeri kullanmak için bir platform.

  • İlk günlerde bu durumda olan bir soyutlama değil, 0, sistem tarafından kullanılan ve adres programcı için sınırlar.

  • Olumsuz numaramı öneri biraz vahşi bir beyin fırtınası yaptım, kabul ediyorum. Kullanarak bir imzalı tamsayı için adresleri biraz savurgan anlamı, eğer bu başka bir null işaretçi (-1 ya da her neyse) değerini alan bölünmüş eşit arasında pozitif tamsayılar bu geçerli adresler ve negatif sayılar sadece israf.

  • Eğer herhangi bir sayı her zaman bir veri türü tarafından temsil edilebilir ise, 0. (Muhtemelen 1 de. Bir bit 0 ya da 1 ise imzasız olurdu, ya da sadece imzalı bit işaretli tamsayı varsa, ya da olacak olan iki bit tamsayı [-2, 1] düşünüyorum. Ama o zaman sadece 0 ve 1 olmak boş bellek (GB bayt olmak için gidebiliriz.)

Hala aklımda çözülmemiş bir şey var. Yığın Taşması soruPointer to a specific fixed addressnull işaretçi için 0 bir soyutlama değilse bile, başka bir işaretçi değerleri mutlaka olmadığını söylüyor. Bu bana bir Yığın Taşması başka bir soruyu doğururCould I ever want to access the address zero?.

CEVAP
3 Mayıs 2010, PAZARTESİ


2 puan:

  • sadece sabit değeri kaynak kodu 0 null işaretçi - derleyici uygulanmasını istiyor ya da çalışan kod neye ihtiyacı varsa kullanabilir. Bazı platformları 'uygulaması geçersiz boş gösterici. olarak kullanabileceği bir' özel işaretçi değeri var C SSS farklı çalışma zamanı temsil ederken C kaynağı boş gösterici olmak 0 Bu özellik kullanılan çeşitli platformlarda işaret ettiği bir soru, "Seriously, have any actual machines really used nonzero null pointers, or different representations for pointers to different types?". C standart bir not yapar açık dönüştürme "bir integral sabiti ile sıfır değeri her zaman verir null işaretçi, ama dönüştürme diğer ifadeler buna gerek sıfır gerek getirebilecek bir null işaretçi".

  • negatif bir değer, bir adres - C standardı sadece bir şey, bir null işaretçi belirtmek için kullanmayı seçti gibi bir platform olarak kullanılabilir olabilir, ve sıfır seçildi. Dürüst olmak gerekirse eğer diğer sentinel değerleri kabul olup olmadığından emin değilim.

Bir null işaretçi için sadece gereksinimleri vardır:

  • garantili eşitsiz gerçek bir nesne için bir işaretçi karşılaştırın
  • her iki null işaretçiler eşit (C) Bu sadece aynı tip işaretçiler tutmak için gereken bu gibi yeniler) karşılaştırır

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Kenneth Håkonsen

    Kenneth Håk

    13 Mart 2011
  • mist64

    mist64

    30 Mayıs 2006
  • WestsideMrArO

    WestsideMrAr

    6 EKİM 2010