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去指向那些額外的空間,這樣就可以實現可變長的結構體了。下面我們來 動態開闢乙個比結構...