İki NULL işaretçi tanımlanmış çıkarılarak davranıştır
Non-void iki işaretçi değişkenlerin fark varsa ikisi de tanımlanmış (ve/veya C 98 C99 başına) NULL
değerli mi?
Örneğin, şuna benzer bir tampon yapısı var ki:
struct buf {
char *buf;
char *pwrite;
char *pread;
} ex;
Dizi ya da bazı malloc çiğnenmiş bir bellek, ex.buf
puan demek. Eğer benim kod pwrite
pread
Bu dizi ya son bir nokta içinde her zaman sağlar, sonra ex.pwrite - ex.pread
her zaman tanımlanacak oldukça eminim. Ancak, eğer pwrite
pread
BOŞ hem de ne. Sadece iki (ptrdiff_t)0
olarak tanımlanır ya da kesinlikle kod Uyumlu mu çıkarılarak NULL işaretçiler test alabilirim? İlgilendiğim tek dava ne zaman olduğunu unutmayınher ikisi deişaretçiler NULL başlatılamadı tampon bir durum teşkil ediyor. Nedeni tam olarak uyumlu "" fonksiyonu yukarıdaki varsayımlar verilen araya geldi . mevcut ile bir ilgisi yoktur
size_t buf_avail(const struct s_buf *b)
{
return b->pwrite - b->pread;
}
CEVAP
C99, teknik olarak tanımlanmamış bir davranış. C99 §6.5.6 diyor ki:
7) bu operatörler amaçları, bir unsuru olmayan bir nesne için bir işaretçi İçin dizi ile uzunluğu tek bir dizinin ilk öğe için bir işaretçi olarak aynı şekilde davranır öğe türü nesne türü.
[...]
İki işaretçileri düşülen 9), Her ikisi de aynı dizi nesnesinin elemanları işaret eder ya dizinin son öğe geçen biri; sonuç arasındaki fark, nesne iki dizi elemanları alt simgeler. [...]
Ve §6.3.2.3/3 diyor ki:
Değeri 0 veya türü için böyle bir ifade dökme ile bir tamsayı sabit ifadesi * *12, null gösterici sabiti denir.55)Eğer null bir işaretçi işaretçi türüne dönüştürülür, elde edilen işaretçi denirnull işaretçieşitsiz herhangi bir nesne veya işlev işaretçisi karşılaştırmak için garanti edilir.
Bir null işaretçi herhangi bir nesneye eşit olduğundan, 6.5.6/9, yani ön koşulları ihlal ediyor yani tanımsız davranış. Ama pratikte, hemen hemen her derleyici herhangi bir kötü yan etkileri olmadan sonuç olarak 0 dönecektir bahis istekli olurdu.
C89 da tanımsız davranış, ifade olsa da bu standart biraz farklıdır.
C-03, diğer taraftan, bu örnekte tanımlanan davranış var. Standart iki null işaretçiler çıkarma için özel bir istisna yapar. C 03 §5.7/7 der
Eğer bu değer 0 veya eklenen işaretçi değeri çıkartılır, sonuç orijinal işaretçi değerine eşit karşılaştırır. Eğer işaretçileri iki noktanın aynı nesne ya da iki nokta bir son sonu aynı Dizi ya da her ikisi de boş ve iki işaretçiler çıkarılır, sonuç karşılaştırır eşit değeri 0 dönüştürülmüş bir tip
ptrdiff_t
.
C 11 (C taslağın son halini 14, n3690) C aynı ifade var ptrdiff_t
yerine std::ptrdiff_t
sadece küçük bir değişiklik ile 03,.
Neden adresi null işaretçi için kullan...
Güvenli bir NULL işaretçi silmek için ...
Boost ile NULL işaretçi::shared_ptr?...
İyi bir uygulama sildikten sonra bir i...
Eğer(pointer) kullanmak yerine eğer be...