struct和union的區別
時間:2023-09-07 來源:華清遠見
首先我們要了解兩者分別是什么?
1. 結構體(struct)
在C語言中,結構體是一種可自定義的數據類型,可以用于聲明變量、指針或數組。結構體的特點在于其是一些元素的集合,這些元素可以是變量,可以是數組,可以是指針,它們完全由程序員指定,這些元素被稱為結構體的成員。
例如:創建一個學生信息(Stu_Info)的結構體,成員:名字(Name)、年齡(Age)、性別(Sex)、成績(Score)。則結構體的一般定義如下:

使用結構體(Stu_Info)定義結構體變量(stu)并使用,示例如下:

2. 共用體(union)
在C語言中,共用體也稱為聯合體,也是一種自定義的數據類型。其特點是可以有多個成員(成員的類型是由程序員指定的),但是在任何時候都只能有一個成員有值。其提供了一種使用相同的內存位置的有效方式。
共用體的使用在代碼書寫上和結構體很相似:

由這個示例可驗證共用體Uni的成員a、b是共用存儲空間的,我們可以采用這種方式獲取計算機的存儲方式(大小端序)。
區別
二者的區別是什么呢?答:內存占用。
結構體作為成員的集合,其各自成員擁有自己的內存,互不影響。并且結構體變量的長度計算規則:在遵循內存對齊原則,為所以成員長度之和。
共用體的成員共用存儲空間,成員的使用上是互斥的。共用體變量的長度計算規則:足夠容納最寬的成員,并且能被所有成員數據類型的長度的整數倍。
對64位機下結構體和共用體計算長度,示例如下:


對Str結構體,最大的數據類型為double,在64位機占8個字節,按照8字節對齊。成員a長度8+1,多出的部分與成員b組成8個字節,成員c占8個字節,所以總共24字節。
對Uni共用體,最寬成員為a,9個字節,所以至少大于9。最大數據類型double,所以為8字節的整數倍,計算結果16字節。

