SORU
27 Kasım 2011, Pazar


Gerekli C/NULL sıfır olarak tanımlanır?

BOŞ GCC test programlarım sıfır görünüyor, ama Vikipedi NULL sadece unaddressable bellek işaret etmek için gerekli olduğunu söylüyor.

Herhangi Derleyiciler NULL sıfır yapabilirim? if (ptr == NULL) if (!ptr) daha iyi bir uygulama olup olmadığını merak ediyorum.

CEVAP
27 Kasım 2011, Pazar


NULL sıfır, belki de (void *) döküm olması sağlanır1.

C99, §6.3.2.3, ¶3

Değeri bir tamsayı sabit ifadesi 0 veya türü için böyle bir ifade dökme * *7, null gösterici sabiti denir.(55) boş sabit dönüştürülür işaretçi işaretçi türü, elde edilen işaretçi, boş bir işaretçi olarak adlandırılan, eşitsiz karşılaştırın garantilidir herhangi bir nesne veya işlev işaretçisi için.

Ve not 55 diyor ki:

55) makro NULL null bir işaretçi olarak <stddef.h> (diğer başlıklar) olarak tanımlanır.

Dikkat edin, çünkü ne kadar kuralları null işaretçiler formüle edilmiş, değeri kullanın atamak/karşılaştırmak null işaretçiler. garantili sıfır ama biraz desen aslında içinde saklı işaretçi olabilir başka bir şey (ama bildiğim kadarıyla sadece birkaç çok ezoterik platformlar sömürülen bu aslında, ve bu olmamalıdır bir sorun zaten, zira "görmek" temel bit desen gitmelisin içine UB-arazi zaten).

< / ^ hr .

Yani, bildiğim kadarıyla standart ile ilgili olarak, iki formları eşdeğer (!ptr eşdeğer ptr==0 nedeniyle §6.5.3.3 ¶5 ptr==0 eşdeğer ptr==NULL); if(!ptr) da oldukça deyimsel.

Bu varlık, genellikle açıkça if(ptr==NULL) if(!ptr) yerine bir boolean değeri yerine hiçlik için bir işaretçi kontrol ediyorum ekstra açık yazma dedi.

< / ^ hr .
  1. Dikkat edin C void * dökme olamaz şimdiki nedeniyle sıkı örtülü çevrim kuralları bu kullanım böyle NULL hantal (miydin açıkça dönüştürmek için karşılaştırıldığında işaretçi türünü her zaman).

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ASUS Campus Life

    ASUS Campus

    18 Mart 2013
  • LiteralMSPaint

    LiteralMSPai

    27 EKİM 2010
  • Living Waters

    Living Water

    9 AĞUSTOS 2006