1. 程式人生 > >C語言中,為什麼結構體後面經常定義一個空陣列

C語言中,為什麼結構體後面經常定義一個空陣列

最近在寫C程式碼,經常看到Linux 的標頭檔案中有的結構體後面會定義一個空陣列,不知道其為何作用?經過高人指點終於明白其要點!

struct inotify_event {
   __s32 wd;
   __u32 mask;
   __u32 cookie;
   __u32 len;
   char name[0];
};

如上,結構體最後一個元素name為空陣列。

這是個廣泛使用的常見技巧,常用來構成緩衝區。如果你是做嵌入式開發,這種技巧應該用得漫天飛了。 比起指標用空陣列有這樣的優勢:

1. 不需要初始化,陣列名直接就是緩衝區資料的起始地址(如果存在資料)

2. 不佔任何空間,指標需要佔用4 byte長度空間,空陣列不佔任何空間,節約了空間

“這個陣列不佔用任何記憶體”,意味著在計算結構體的size時,不會計算最後一個元素,例如上面sizeof(struct inotify_event) = 16 bytes (前四個元素的記憶體長度)


這種空陣列定義最適合製作動態buffer,因為可以這樣分配空間:

malloc( sizeof(struct XXX)+ buff_len );

這樣的好處是:直接就把buffer的結構體和緩衝區一塊分配了,空陣列其實變成了buff_len長度的陣列了,一次分配省了不少麻煩。

1. 大家知道為了防止記憶體洩漏,如果是分兩次分配(結構體和緩衝區),那麼要是第二次malloc失敗了,必須回滾釋放第一個分配的結構體。這樣帶來了編碼麻煩。

2. 其次,分配了第二個緩衝區以後,如果結構裡面用的是指標,還要為這個指標賦值。同樣,在free這個buffer的時候,用指標也要兩次free。如果用空陣列,所有問題一次解決

如此看來,用空陣列既簡化編碼,又解決了記憶體管理問題提高了效能,何樂不為?應該廣泛採用。