c 中的聯合體Union

2021-08-27 11:47:29 字數 1491 閱讀 8815

union介紹

共用體,也叫聯合體,在乙個「聯合」內可以定義多種不同的資料型別, 乙個被說明為該「聯合」型別的變數中,允許裝入該「聯合」所定義的任何一種資料,這些資料共享同一段記憶體,以達到節省空間的目的。union變數所占用的記憶體長度等於最長的成員的記憶體長度。

union與struct比較

先看乙個關於struct的例子:

struct student

;

其struct的記憶體結構如下,sizeof(struct student)的值為12bytes。

下面是關於union的例子:

union test

;

sizeof(union test)的值為4。因為共用體將乙個char型別的mark、乙個long型別的num變數和乙個float型別的score變數存放在同乙個位址開始的記憶體單元中,而char型別和long型別所佔的記憶體位元組數是不一樣的,但是在union中都是從同乙個位址存放的,也就是使用的覆蓋技術,這三個變數互相覆蓋,而這種使幾個不同的變數共占同一段記憶體的結構,稱為「共用體」型別的結構。其union型別的結構如下:

因union中的所有成員起始位址都是一樣的,所以&a.mark、&a.num和&a.score的值都是一樣的。

不能如下使用:

union test a;

printf("%d", a); //錯誤

由於a的儲存區有好幾種型別,分別佔不同長度的儲存區,僅寫共用體變數名a,這樣使編譯器無法確定究竟輸出的哪乙個成員的值。

printf("%d", a.mark);  //正確
測試大小端union的乙個用法就是可以用來測試cpu是大端模式還是小端模式:

#include using namespace std;

void checkcpu()

test;

test.a = 1;

if (test.c == 1)

cout << "little endian" <

舉例,**如下:

#include using namespace std;

union test

a;int main()

;union test

;int main()

上面**執行沒有問題。

如果在類ca中新增了建構函式,或者新增析構函式,就會發現程式會出現錯誤。由於union裡面的東西共享記憶體,所以不能定義靜態、引用型別的變數。由於在union裡也不允許存放帶有建構函式、析構函式和複製建構函式等的類的物件,但是可以存放對應的類物件指標。編譯器無法保證類的建構函式和析構函式得到正確的呼叫,由此,就可能出現記憶體洩漏。所以,在c++中使用union時,盡量保持c語言中使用union的風格,盡量不要讓union帶有物件。

c語言 union聯合體

linux中聯合體union實現判斷little endian 和 big endian 大端和小端 1 聯合體的資料成員從低位元組開始對齊 2 little endian 和 big endian。little endian 和 big endian 是 cpu 存放資料的兩種不同順序。對於整型 ...

C語言聯合體union

c語言中的聯合體union 在c c 程式的編寫中,當多個基本資料型別或復合資料結構要占用同一片記憶體時,我們要使用聯合體 當多種型別,多個物件,多個事物只取其一時 我們姑且通俗地稱其為 n 選1 我們也 可以使用聯合體來發揮其長處。首先看一段 union myun u int k a int ma...

union聯合體學習

union,中文名 聯合體 共用體 在某種程度上類似結構體struct的一種資料結構,共用體 union 和結構體 struct 同樣可以包含很多種資料型別和變數。不過區別也挺明顯 結構體 struct 中所有變數是 共存 的 優點是 有容乃大 全面 缺點是struct記憶體空間的分配是粗放的,不管...