c語言變長結構體

2021-08-07 11:07:38 字數 1039 閱讀 2310

1.什麼是變長陣列

struct mydata 

;

sizeof(mydata)=4;

可能有的編譯器不支援char data[0];需要用char data[1];代替,這樣上面結構體大小是sizeof(mydata)=8(位元組對齊);

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

c語言裡的陣列擴充套件

如下下所示:

#include using namespace std;

struct mydata

;int main()

//輸出:

size of mydata: 4

mydata's data is: 123456789

//由於陣列沒有元素,該陣列在該結構體中不分配占用空間,所以sizeof(struct mydata) = 4。

實際用時採取這樣:

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

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

struct mydata1 

;struct mydata2 

;對於上面兩個結構體有下面幾點說明:

1. mydata1  (char data[0])結構體占用記憶體最小,mydata2有個指標占用4b

2.mydata1與前面結構體資料是連續的記憶體儲存空間,而mydata2下,新增加資料data是單獨開闢的空間;

3.釋放記憶體時,mydata1可以直接釋放,而mydata2需要先釋放指標指向記憶體,然後再釋放結構體資料部分否則會記憶體洩漏

C語言 變長結構體

其實真正意義上並不是結構體的大小可變,而是使用結構體中的變數代表乙個位址,從而訪問超出結構體大小範圍的資料。struct var len struct 那結構體是怎麼實現可變長的呢?如上所示,請注意看結構體中的最後乙個元素,乙個沒有元素的陣列。我們可以通過動態開闢乙個比結構體大的空間,然後讓buff...

可變長陣列 柔性陣列結構體成員 可變長結構體

可變長陣列是c99相較c89新增的乙個特性。1.可變長陣列無鏈結性,即只在 塊內作用 函式體內或者區域性 塊內 2.可變長陣列不可初始化。3.陣列長度在生存週期不可更改。即n的值不影響str的長度。4.可變長陣列作為函式形參的時候,中使用 其本質是指標。形參中的陣列還可以使用型別限定詞const v...

變長結構體之結構體指標申請記憶體

什麼叫變長結構體?typedef struct student 那結構體是怎麼實現可變長的呢?如上所示,請注意看結構體中的最後乙個元素,乙個沒有元素的陣列。我們可以通過動態開闢乙個比結構體大的空間,然後讓buffer去指向那些額外的空間,這樣就可以實現可變長的結構體了。下面我們來 動態開闢乙個比結構...