SORU
1 ŞUBAT 2013, Cuma


Ne'In elemanları?sıfır ile dizinin lazım

Linux çekirdek kod anlayamıyorum şu şey buldum.

 struct bts_action {
         u16 type;
         u16 size;
         u8 data[0];
 } __attribute__ ((packed));

Kod burada: http://lxr.free-electrons.com/source/include/linux/ti_wilink_st.h

Sıfır elemanları ile verileri bir dizi ihtiyacı ve amacı nedir?

CEVAP
1 ŞUBAT 2013, Cuma


Bu verilerin değişken boyutları, malloc (kmalloc) iki kez aramak zorunda kalmadan bir yolu. Bu gibi kullanabilirsiniz:

struct bts_action *var = kmalloc(sizeof(*var)   extra, GFP_KERNEL);

Bu standart ve kesmek kabul edildi Aniket dediği gibi), ama olduC99 standart. Bunun için standart biçimi olarak ..

struct bts_action {
     u16 type;
     u16 size;
     u8 data[];
} __attribute__ ((packed)); /* Note: the __attribute__ is irrelevant here */

data alan için herhangi bir boyut söz yok unutmayın. Bu özel değişken tek yapı sonunda gelebilir unutmayın.


İçinde C99, bu konuda 6.7.2.1.16 (vurgu benim) açıkladı

Özel bir durum, birden fazla üye adında bir yapısı son öğesi olabilir tamamlanmamış bir dizi türü vardır;bu esnek bir dizi üye denir. Çoğu durumda, esnek dizi üyesinin göz ardı edilir. Özellikle, yapısı, boyutu gibi. esnek dizi üyesinin daha fazla doldurma izleyen var olabilir dışında atlanmış ihmal etmek anlamına gelir. Ancak, ne zaman bir . (ya ->) işleç sol işlenen vardır (işaretçi) esnek bir dizi ile bir yapı ve sağ işlenen isimler üye, eğer o üye en uzun dizisi ile değiştirirse, (eskisi gibi davranır yapısı nesne erişilen daha büyük olmaz bu eleman tipi); dizinin uzaklık eğer bu farklı olsaydı bile esnek dizi üyesinin o kalır yedek basınız. Eğer bu dizide herhangi bir öğe yok, gibi davranır ama bu davranış, eğer herhangi bir girişimi erişmek için yapılırsa tanımsız bir eleman vardı eleman yoksa geçmiş işaretçi bir tane oluşturmak için.

Eğer varsa ya da diğer bir deyişle:

struct something
{
    /* other variables */
    char data[];
}

struct something *var = malloc(sizeof(*var)   extra);

[0, extra) Endeksi var->data erişebilirsiniz. sizeof(struct something) tek boyut, diğer değişkenler için hesap verecek unutmayın, yani data 0 boyut kazandırıyor.


Standart aslında mallocıng örnekleri de böyle bir kavram verir ne kadar dikkat çekici de (6.7.2.1.17) olabilir:

struct s { int n; double d[]; };

int m = /* some value */;
struct s *p = malloc(sizeof (struct s)   sizeof (double [m]));

Aynı yerde standart tarafından başka bir ilginç not (vurgu benim):

malloc çağrısı başarılı olduğunu varsayarsak, nesneyi p ile gösterilen p olarak ilan edilmiş olsaydı, çoğu amaç için hareket eder:

struct { int n; double d[m]; } *p;

(bu denklik; özellikle kırılmış durumlar vardırüye d uzaklıklar aynı olmayabilir).

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Joshua Benedict

    Joshua Bened

    26 EKİM 2013
  • kylediablo

    kylediablo

    8 Ocak 2007
  • TSE

    TSE

    12 Kasım 2012