SORU
13 Kasım 2014, PERŞEMBE


&((Yapı adı *)NULL -> b) neden C11 tanımsız davranış mı?

Kod örneği:

struct name
{
    int a, b;
};

int main()
{
    &(((struct name *)NULL)->b);
}

Bu tanımsız davranışlara neden olur mu? Öyle olsun tartışma yapabiliriz "" terimi tanımlamaz, ancak C11"". çözümlemesi çözümlemesi null

6.5.3.2/4 açıkça diyor kullanarak * bir null işaretçi neden tanımsız davranış; ancak yazmıyor aynı için -> ve de tanımlamıyor a -> b (*a).b ; ayrı tanımları için her bir operatör.

6.5.2.3/4 -> semantiği diyor ki:

Postfix bir ifade - ^ izledi . operatör ve tanımlayıcı bir üye atar yapı veya birlik bir nesne. Değeri nesnenin adlı üyenin olmasıdır ilk ifade puan, ve bir lvalue.

Ancak, NULL bir nesneye işaret etmiyor, bu yüzden ikinci cümle underspecified görünüyor.

Aynı zamanda, ilgili olabilir 6.5.3.2/1:

Kısıtlamalar:

& tekli işleç işlenen bir işlev göstergesi, bir sonucu da olacaktır [] 10 ** operatör, ya da bir teklilvalue bir nesneyi atarbir bit alanı değildir. kayıt ile beyan Depolama sınıfı belirleyicisi değil.

Ancak kalın metin arızalı olduğunu ve okumak gerektiğini düşünüyorumlvalue potansiyel bir nesneyi atar, 6.3.2.1/1 başı olarak tanımılvalue) -- C99 C11 tekrar yazmak zorunda kaldım lvalue tanımı berbat, ve bu bölümde unutulan belki de.

6.3.2.1/1 yazıyor:

Bir lvalue expression (nesne türü void dışında) potansiyel. eğer bir lvalue, değerlendirildiğinde bir nesne atarsınız yoksa bir nesnenin belirtir; davranış tanımsızdır

ancak & operatöryokonun işlenen değerlendirir. Saklı değer erişimi değil ama farklı).

Akıl bu uzun zincir Standart yazarları amacı buydu kod nedenleri oldukça zayıf, ancak İK ve bana net değil önermek gibi görünüyor. Aslında hiçbir şey bize ait tartışma:) bırakmak yerine çağırdılar

CEVAP
13 Kasım 2014, PERŞEMBE


Görüş avukat açıdan bakıldığında, 12 ** ifadesi, İK olacağına dair bir yol bulamayınca bu yana İK yol açar. IMHO kök neden bir anda bir nesneye işaret eden bir deyim -> operatör uygulanır.

Görüş derleyici bir noktadan, derleyici programcı overcomplicated olmadığını varsayarsak, ifade offsetof(name, b) gibi aynı değeri döndürür açıktır, ve bu oldukça eminimverilen hata olmadan derlenmişvarolan herhangi bir derleyici sonuç verecektir.

Yazılı olarak, biz suçlu bir derleyici o olur unutmayın içi kullandığınız operatör -> bir ifade daha olamaz noktasına bir nesne (beri boş) ve sorun, bir uyarı veya bir hata.

Vardığım sonuç sadece adresi almak şartıyla yasal olduğunu söyleyerek, bir null işaretçi çözümlemesi yapmak özel bir paragraf kadar, bu ifade C. yasal değildir

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Gavin Hoey

    Gavin Hoey

    21 Aralık 2007
  • Michael Lummio

    Michael Lumm

    25 Mayıs 2007
  • TechnoBuffalo

    TechnoBuffal

    8 HAZİRAN 2007