结构体后面定义一个空数组的含义
最近在寫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。如果用空數組,所有問題一次解決
如此看來,用空數組既簡化編碼,又解決了內存管理問題提高了性能,何樂不為?應該廣泛采用。
————————————————
版權聲明:本文為CSDN博主「蒼痕」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/wangbaochu/article/details/50663876
總結
以上是生活随笔為你收集整理的结构体后面定义一个空数组的含义的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gcc 优化选项 -O1 -O2 -O3
- 下一篇: SDIO协议概述