SORU
14 Ocak 2014, Salı


C 0 kaldırma bir işaretçi

Bazen veri bellek adresi 0x0 oldukça değerli ... 86 gerçek mod IVT olarak daha çok bilinen örnek: başlar en 0x0 içeren işaretçiler kesme işleyicileri: bir dword de 0x00 bir işaretçi için sıfıra bölme hata işleyicisi.

Ancak, C11 dil standart yasaklar kaldırma null işaretçiler [WG14 N1570 6.5.3.2], tanımlanan işaretçiler başlatıldı ile 0 veya işaretçiler başlatılmış bir null işaretçi [WG14 N1570 6.3.2.3], etkin bir şekilde yasaklayan ilk bayt.

Nasıl insanlar gerçekten ihtiyaç duyulan zaman 0x0 kullanıyor?

CEVAP
14 Ocak 2014, Salı


C değilyasaklarnull işaretçi kaldırma, sadece tanımsız davranış yapar.

Eğer ortam adresini içeren bir işaretçi çözümlemesi edebiliyoruz böyle ise 0x0, o zaman bunu yapmak gerekir. C dili standart bunu yaptığınızda ne olacağı hakkında hiçbir şey söylemez. (Ve pek çok ortamda, sonucu program bir kaza olacak.)

Somut bir örnek (eğer ben hatırlamak bu doğru): 68 k tabanlı Güneş 3 bilgisayar, kaldırma bir null işaretçi vermedi neden bir tuzak; bunun yerine, OS saklı bir sıfır değeri bellek adresi sıfır ve kaldırma bir null işaretçi (hangi sivri Adres sıfır) verim değeri sıfır. Bir C programı boş bir dize geçerli bir işaretçi olarak bir boş gösterici tedavi olabilir, örneğin demekti. Bazı yazılımlar, kasıtlı ya da değil, bu davranış bağlıydı. Bu SPARC tabanlı Sun yazılım taşıma boş işaretçi çözümlemesi yakalanan 4, Ne zaman temizlik çok gerekli. (Ben kesinlikle bunu okuduğumu hatırlıyorum, ama bir referans bulamadım; eğer bulabilirsem bu güncelleriz.)

Boş gösterici olduğunu unutmayındeğilmutlaka sıfır; daha doğrusu Adres, boş bir temsili olabilir ya da all-bit-sıfır olmayabilir. Bu çok sık olur, ama garanti değil. Eğer değilse ((void*)0 bir tamsayı için işaretçi dönüşüm önemsiz değil.)

comp.lang.c FAQ Bölüm 5 anlatılır işaretçiler null.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • EvilControllers

    EvilControll

    20 Ocak 2008
  • Samvith V Rao

    Samvith V Ra

    20 EKİM 2006
  • Tylerron

    Tylerron

    6 AĞUSTOS 2006