結構體最後的零長度陣列

滕瑞發表於2016-10-31

零長度陣列是C語言中的一個小技巧,在Linux核心程式碼中能見到很多例項。例如include/linux/mm.h中

/* Container for pinned pfns / pages */
struct frame_vector {
    unsigned int nr_allocated;    /* Number of frames we have space for */
    unsigned int nr_frames;    /* Number of frames stored in ptrs array */
    bool got_ref;        /* Did we pin pages by getting page ref? */
    bool is_pfns;        /* Does array contain pages or pfns? */
    void *ptrs[0];        /* Array of pinned pfns / pages. Use
                         * pfns_vector_pages() or pfns_vector_pfns()
                         * for access */
};

其中ptrs就是零長度陣列,這種用法的特點是:

  1. 一般放在結構體的最後
  2. 結構體中要有記錄後續空間長度的資訊,例如nr_frames
  3. 申請空間的時候需要動態申請後續的連續空間
  4. 這種用法的好處是ptrs不佔用結構體的空間,因為一個零長度陣列,sizeof得到結果會是0,如果定義一個指標則需要額外的空間。

相關文章