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

2021-06-15 21:24:30 字數 610 閱讀 4652

定義乙個結構體如下:

typedef struct buffer_s buffer_t;

大家注意到最後那個長度為0的字元陣列了吧?不知道你疑惑了沒。嘿嘿!!!

這個常用技巧常用來構成緩衝區:

陣列名就代表了該結構體後面資料的起始位址(而且無需初始化,不佔空間) 而如果用指標的話,我們還要初始化,而且還要佔空間(好象是int型別長度的空間)

見程式**如下:

buffer_t *buf;

int buf_len    /*緩衝區資料的長度*/

/*直接把buffer的結構體跟存放資料的記憶體一起分配了*/

buf = (buffer_t *) malloc(

sizeof(buffer_t) + buf_len);

buf->data = "我就是緩衝中的內容/n";

/*也可以下面這樣引用:*/

buf->data

= 'a';  /*i的取值範圍:0~buf_len-1*/

怎麼樣?明白幾分了?

在結構體中,我們定義了0長度的陣列,按理buf->data = 'a';屬於越界訪問,但是我們把結構體後面的buf_len個長度的空間也一起申請了,所以該訪問是合法的!

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

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

結構體的最後定義乙個大小為0 的陣列

有很多結構體的最後都定義了乙個大小為0 的陣列,如drivers oprofile cpu buffer.h中 struct op sample 結構體最後的長度為0的陣列是gcc中廣泛使用技巧,常用來構成可變長緩衝區。在建立時,malloc一段結構體大小加上可變長資料長度的空間給它 malloc ...

結構體中最後乙個成員陣列定義0個元素的意義

struct mydata 在結構中,data是乙個陣列名 但該陣列沒有元素 該陣列的真實位址緊隨結構體mydata之後,而這個位址就是結構體後面資料的位址 如果給這個結構體分配的內容大於這個結構體實際大小,後面多餘的部分就是這個data的內容 這種宣告方法可以巧妙的實現c語言裡的陣列擴充套件。實際...