零長數組一般用於在預先不知道結構體具體大小,而進行的一種動態內存分配方式,在Linux中是較為廣泛使用的,例如像sk_buff、devres結構體;
下面的結構體(設備資源結構體)便用到了零長數組:
struct devres { struct devres_node node; /* -- 3 pointers */ unsigned long long data[]; /* guarantee ull alignment */ };
struct devres_node { struct list_head entry; dr_release_t release; #ifdef CONFIG_DEBUG_DEVRES const char *name; size_t size; #endif };
devers中的data是個零長數組,對應於res資源分配;當devres分配的空間大於三個字節數(devres_node長度)時,data域便可以訪問到那多出來的數據部分,即資源數據;由於設備資源的不確定性,所以用到這個零長數組是非常必要的,可以靈活分配所需要的的內存空間。
Linux中的許多設計思路涉及到“抽象”的概念,例如本例中,對於設備資源 就是一種抽象概念,對於預先分配多少存儲空間我們是無法確定的,於是零長數組就有了用武之地。