在接觸變長結構體之前,以為會是乙個很難理解的東西,但是這其實算是c裡面的一種技巧吧,優點是:分配了一段連續的記憶體,防止記憶體碎片化以及方便記憶體的管理。
使用變長結構體的格式如下:
struct test
;
重點是結構體的最後乙個成員char b[0]
,是個空陣列。在我們不知道結構體內的某個成員大小是多少的時候,我們在最後乙個成員放置了乙個空陣列,這樣做的好處就是,我們直接用結構體指標申請空間(sizeof(struct) + 給空陣列申請的空間
),就完成了動態分配。
這裡可能讀者會有乙個疑惑,那就是指標也同樣完成這個任務,為什麼不用指標呢。這裡我們就用乙個例子來說明:
#include using namespace std;
#include #include typedef struct
empty;
typedef struct
ptr;
int main()
cout << "--------------------------" << endl;
if(p_ptr->y != null)
}return 0;
}
兩者相比較,得出以下主要結論:
變長結構體的記憶體是連續的(嚴謹的說是虛擬記憶體),而常規方法的不是,所以變長結構體只需釋放一次空間,而常規方法需要釋放兩次。
並且我們使用sizeof
檢視兩個結構體的大小會發現,empty
結構體的大小為4位元組,而ptr
的大小為8位元組,可以得出char b[0]
是不佔記憶體空間的。
最後還有需要注意的一點就是,有些編譯器可能不支援char b[0]
這樣的寫法,可以換成char b[1]
,用法還是一樣的,只是這時的結構體大小變成了4 + 1 + 3 = 8
位元組,最後那個3位元組是由於記憶體對齊填補上的。
struct結構體的變長特性
1 include 2 3using namespace std 45 struct mumble6 910void main 11 同理struct mumble 這種結構體也是不允許的,應該把char pc 0 放在最後,乙個結構體裡只允許乙個char pc 0 也就是說只允許有乙個資料成員是不...
結構體的用法
1 資料型別的定義 struct point 結構體是一種資料型別,故此處被宣告的結構體point,同int char一樣。2 結構體的定義 struct point struct point p1 struct point是資料型別,故struct point p1就相當於int a,是一種定義。...
C vector用法和結構體排序
在c 中,vector是乙個十分有用的容器,下面對這個容器做一下總結。1 基本操作 1 標頭檔案 include.2 建立vector物件,vectorvec 3 尾部插入數字 vec.push back a 4 使用下標訪問元素,cout vec 0 0開始的。5 使用迭代器訪問元素.vector...