嵌入式 在結構體裡申請長度為0的陣列

2021-10-19 23:33:36 字數 814 閱讀 2853

這是一篇筆記

** 長度為0的陣列在標準c和c++中是不允許的,如果使用長度為0的陣列,編譯時會產生錯誤,提示陣列長度不能為0。但在gnuc中,這種用法卻是合法的。它的最典型的用法就是位於陣列中的最後一項,如上面所示,這樣做主要是為了方便記憶體緩衝區的管理。如果你將上面的長度為0的陣列換為指標,那麼在分配記憶體時,需採用兩步:首先,需為結構體分配一塊記憶體空間;其次再為結構體中的成員變數分配記憶體空間。這樣兩次分配的記憶體是不連續的,需要分別對其進行管理。當使用長度為的陣列時,則是採用一次分配的原則,一次性將所需的記憶體全部分配給它。相反,釋放時也是一樣的。

1 struct line ;5

6 struct line *thisline =

(struct line *

)malloc

(sizeof

(struct line)

+ this_length)

;7 thisline-

>length = this_length;

這段**的主要含義是定義了乙個結構體,並對其進行初始化,上面結構體的第二個成員變數contents[0]事實上是不佔記憶體空間的,因此整個結構體的長度sizeof(struct line)為4。當採用malloc為其申請記憶體空間時,如上所示,申請了一段長度為結構體長度加可變長度的記憶體空間給結構體型別的指標,這時contents就指向申請的可變長度的記憶體空間。由於是一次申請的,所以這段可變長度的記憶體空間和前面的結構體長度的記憶體空間是連續的。對於這段可變長度的記憶體空間,可以採用陣列的方式對其進行訪問。對於整個結構體,當不再使用時,可以使用free函式一次性對其進行釋放,而不必像指標那樣分別釋放。

在結構體最後定義乙個長度為0的字元陣列(技巧)

定義乙個結構體如下 typedef struct buffer s buffer t 大家注意到最後那個長度為0的字元陣列了吧?不知道你疑惑了沒。嘿嘿!這個常用技巧常用來構成緩衝區 陣列名就代表了該結構體後面資料的起始位址 而且無需初始化,不佔空間 而如果用指標的話,我們還要初始化,而且還要佔空間 ...

嵌入式C開發中用到的位域結構體

存放乙個開關量或者其他開關狀態時,用一位二進位即可。為了減少嵌入式記憶體資源的開銷,可以使用位域進行定義,位域是c語言支援的一種資料結構,稱為 位域 或 位段 位域 是把乙個位元組中的每個位劃分為幾個不同的區域,並指明每個區域的位數。每個域有乙個網域名稱,允許在程式中按網域名稱進行操作。定義乙個結構...

結構體中最後乙個元素是長度為0的陣列

在linux源 中,有很多的結構體最後都定義了乙個元素個數為0個的陣列,如 usr include linux if pppox.h中有這樣乙個結構體 struct pppoe tag attribute packed 又如在asterisk的原始碼中的pbx.c struct ast ignore...