SORU
14 Kasım 2011, PAZARTESİ


İ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
14 Kasım 2011, PAZARTESİ


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,.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Autocar

    Autocar

    11 Mart 2006
  • Dion Coulls

    Dion Coulls

    16 AĞUSTOS 2006
  • ThreadBanger

    ThreadBanger

    2 Mart 2007