2016-03-24 23 views
-3

Bildiğimle başlayacağım: C standardı, NULL'un (bir şekilde) kuramsal olarak herhangi bir şeye işaret etmediği geçersiz bir işaretçiye atıfta bulunmasını gerektirir. Yani örneğin malloc(), bir hata oluşması durumunda NULL işaretçisini beklememelidir. NULL'un sıklıkla ((void*)0) olarak temsil edildiğini ve derleyicinin bu işaretçi-sıfırı sembolik BOŞ işaretçisinin (esasen adrese ulaşılamaz anlamında) teorik gereksinimlerini karşılayan uygulama tanımlı bir adrese çevirdiğini biliyorum.Offlimit Adres/Pointers in C

Şimdi, varsayımsal olarak NULL ile aynı kesin özelliklere sahip olan başka bir NULL (NULL2 olarak adlandırın) ihtiyacım var diyelim, ancak NULL (NULL! = NULL2) olarak da ayırt edilebilir. Belleği anladığımdan (ki bu pek de fazla değil) NULL işaretçisi sık sık sınırsız olan bir bellek segmentindeki bir adrese işaret eder. Yani demek istediğim, genellikle sadece bir adres değil, sınırların dışında kalan bir bellek segmentidir. Yani NULL2'yi NULL + 1 olarak tanımladığımı söyleyebilirim (muhtemelen sizi bir çırpıda ya da belki biraz tıkar), NULL2'nin kuramsal olarak (sadece tanımladığım gibi) ulaşılamaması da (aynı anlamda NULL erişilemez)?

Bu cevabın tamamen platforma özel olmasını beklerim, bu yüzden örnekler tam aradığım şeydir. Ancak daha genel olarak, ISO-C Standardının NULL ile aynı şekilde geçersiz (veya ulaşılamaz veya herhangi bir şekilde) olarak tanımladığı başka bir işaretçi adresi vardır. Geçersiz olan tüm adreslerin (veya resmi olmayanların) ve neden geçersiz olduklarının genel bir açıklaması da yararlı olacaktır. Ve eğer bana sorma ihtiyacı duyuyorsanız, "Neden Tanrı'nın sevgisi için bunu yapmam gerekecek" cevabım gerçekten bir şey yapmam gerekmeyecek; onun sadece bir varsayımsal sorusu.

+0

Metninizi paragraflara yerleştirin. –

+0

Lütfen [sor] 'u okuyun. – OldProgrammer

+0

Varsa, varsayımsal olarak, bunu istiyorsanız, bu özel davranışla kendi dilinizi oluşturmalısınız. C'de yapamazsınız ve eğer farklı şeyleri temsil etmeyeceklerse iki farklı tür geçersiz işaretçiyi tanımlayamazsınız. –

cevap

0

Hayır, NULL sıfır anlamına gelir. Evet, NULL + 1 davranışını kullanarak platforma özel olmalıdır. Ancak, 0x0001 adresinin programcı için sık sık kullanılabileceğinden kuşku duyuyorum, bu yüzden uygun olmayan bir adres olarak düşünülebilir. Ben bu gibi bir şey yapacağını Senin yerine

: (vurgu:

#define NULL2 null2() 
void *null2() 
{ 
    static char pointing_me_is_invalid; 
    return &pointing_me_is_invalid; 
} 
0

Sadece NULL + 1 6.5.6 Katkı operatörler diyor

N1570 C. tanımsız davranışı hatırlar yapıyor korkuyorum madeni) eklenmesi için

2, her iki işlenen aritmetik tip eder veya bir işlenen ac bir işaretçi olacaktır ya omplete nesne türü ve diğer tamsayı türüne sahip olmalıdır.

Ben NULL tam nesne türüne işaret garantilidir sanmıyorum (artırım yapılması 1. eklemeye eşdeğerdir). Örneğin, ((void *)0) yapmıyor.

Hala "varsayımsal bir soru" olsa bile neden başka bir erişilemez adres sabitine ihtiyacınız olduğunu anlayamıyorum. Eğer gerçekten böyle bir sabit varsa, taşınabilir olamaz. Bu yüzden 0 veya NULL'u kullanın ve derleyiciniz gerisini halledecektir.