零長度陣列

2021-09-25 14:04:20 字數 794 閱讀 1187

適用於c語言變長陣列

在實際的程式設計中,我們經常需要使用變長陣列,但是c語言並不支援變長的陣列。此時,我們可以使用結構體的方法實現c語言變長陣列。

struct mydata ;

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

實際用時採取這樣:

struct mydata *p = (struct mydata *)malloc(sizeof(struct mydata )+strlen(str))

這樣就可以通過p->data 來操作這個str。

ps:必須將指標定義在struct的末尾,指標的型別也可以不為char。

節省記憶體,零長度陣列不占用記憶體空間,而指標卻占用記憶體空間。

方便記憶體釋放。如果我們的**是在乙個給別人用的函式中,你在裡面做了二次記憶體分配,並把整個結構體返回給使用者。使用者呼叫free可以釋放結構體,但是使用者並不知道這個結構體內的成員也需要free,所以你不能指望使用者來發現這個事。所以,如果我們把結構體的記憶體以及其成員要的記憶體一次性分配好了,並返回給使用者乙個結構體指標,使用者做一次free就可以把所有的記憶體也給釋放掉。

有利於訪問速度。連續的記憶體有益於提高訪問速度,也有益於減少記憶體碎片。

零長度陣列

零長度陣列 神奇的int reserve 0 include include struct device 構題 device 之後 這種宣告方法可以巧妙的實現c語 言裡的陣列擴充套件 int main a.out p dev reserve 0 100 p dev reserve 24 0 size...

零長度陣列

最近在準備分析linux input子系統,發現核心 裡面有很多小技巧。特此記錄下,如有不足之處,敬請指正。在日常的程式設計中,有時候需要在結構體中存放乙個長度動態的字串,比如說,我們要在結構體中存放乙個名字,但是這個名字的長度是未知的。於是,我們就會採用以下兩種方法來解決這個問題。注 以下的 都是...

整理 零長度陣列

零長度陣列 gnu c 允許使用零長度陣列,在定義變長物件的頭結構時,這個特性非常有用。例 如 include linux minix fs.h struct minix dir entry 結構的最後乙個元素定義為零長度陣列,它不佔結構的空間。在標準 c 中則需要 定義陣列長度為 1,分配時計算物...