解析變長結構體的用法和優點

2021-10-11 21:48:56 字數 1058 閱讀 7143

在接觸變長結構體之前,以為會是乙個很難理解的東西,但是這其實算是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...