- 概念
- 在C語言中,共用體(Union)是一種特殊的資料型別。它可以在不同的時刻儲存不同型別的資料,但所有成員共享同一塊記憶體空間。這與結構體不同,結構體的每個成員都有自己獨立的記憶體空間。
- 定義和宣告
- 定義
- 共用體的定義形式與結構體相似,使用關鍵字
union
。例如:union Data { int num; char ch; float f; };
- 這裡定義了一個名為
Data
的共用體,它有三個成員:int
型別的num
、char
型別的ch
和float
型別的f
。
- 共用體的定義形式與結構體相似,使用關鍵字
- 宣告
- 可以在定義共用體之後宣告共用體變數。例如:
union Data data;
- 也可以在定義共用體的同時宣告共用體變數:
union Data { int num; char ch; float f; } data;
- 可以在定義共用體之後宣告共用體變數。例如:
- 定義
- 記憶體共享特性
- 由於共用體的所有成員共享同一塊記憶體空間,所以共用體的大小取決於其最大成員的大小。例如,在上述
union Data
中,如果int
佔4位元組,char
佔1位元組,float
佔4位元組,那麼union Data
的大小為4位元組。 - 當給共用體的一個成員賦值時,會覆蓋共用體中其他成員的值(因為它們共享記憶體)。例如:
union Data data; data.num = 10; printf("num: %d\n", data.num); data.ch = 'a'; printf("ch: %c\n", data.ch); // 此時,由於給ch賦值,num的值已經被覆蓋,再次訪問num的值是不確定的
- 由於共用體的所有成員共享同一塊記憶體空間,所以共用體的大小取決於其最大成員的大小。例如,在上述
- 使用場景
- 節省記憶體空間
- 在某些情況下,如果有一組資料,這些資料不會同時使用,就可以使用共用體來節省記憶體空間。例如,在一個裝置驅動程式中,可能有一個資料結構用於儲存裝置的狀態資訊,這個狀態資訊可能是一個整數表示的錯誤程式碼,或者是一個字元表示的裝置狀態標識,使用共用體可以避免為這兩種不同型別的狀態資訊分別分配獨立的記憶體空間。
- 資料型別轉換
- 共用體可以用於實現簡單的資料型別轉換。例如,將一個整數轉換為位元組陣列。可以定義一個共用體,其中一個成員是整數,另一個成員是字元陣列,透過給整數成員賦值,然後從字元陣列成員中獲取位元組資料。
- 節省記憶體空間
- 與結構體的區別
- 記憶體分配
- 結構體的每個成員都有自己獨立的記憶體空間,結構體的大小是所有成員大小之和(考慮記憶體對齊)。而共用體所有成員共享同一塊記憶體空間,其大小取決於最大成員的大小。
- 資料儲存和訪問
- 在結構體中,可以同時儲存和訪問多個成員的值。在共用體中,同一時刻只能儲存和訪問一個成員的值,因為成員共享記憶體,給一個成員賦值會影響其他成員的值。
- 記憶體分配
- 注意事項
- 資料覆蓋風險
- 由於共用體成員共享記憶體,在使用共用體時要特別注意資料覆蓋的問題。如果不小心訪問了已經被覆蓋的成員的值,可能會得到錯誤的結果。
- 型別相容性
- 在使用共用體進行資料轉換或操作時,要確保資料型別之間的相容性。例如,不能將一個不相容的資料型別賦給共用體成員,否則可能會導致程式執行時錯誤。
- 資料覆蓋風險
C語言 共用體
相關文章
- C語言(共用體型別)C語言型別
- c語言基礎筆記DAY7_結構體共用體列舉C語言筆記結構體
- C語言 第八章 結構體與共用體 重點 典型題C語言結構體
- c++結構體、共用體(聯合體)C++結構體
- C語言完美體系C語言
- C語言(結構體)C語言結構體
- C語言-記憶體分配C語言記憶體
- C語言:記憶體使用C語言記憶體
- C語言 C語言野指標C語言指標
- C語言---“C語言 誰與爭鋒?”C語言
- C語言的記憶體分配C語言記憶體
- C語言結構體專題C語言結構體
- C語言記憶體對齊C語言記憶體
- C語言C語言
- C語言(動態記憶體分配)C語言記憶體
- C語言記憶體地址基礎C語言記憶體
- 聊聊C語言/C++—程式和程式語言C語言C++
- 結構體與共用體結構體
- C語言-->(十四)結構體、巨集、編譯C語言結構體編譯
- 乾貨分享 | C語言的聯合體C語言
- C語言結構體作為形參C語言結構體
- 深入體驗C語言專案開發C語言
- C語言_瞭解下結構體指標C語言結構體指標
- C語言字串C語言字串
- C語言: returnC語言
- C語言(一)C語言
- C語言概述C語言
- c語言 %pC語言
- 字串(C語言)字串C語言
- C語言程式C語言
- CUDA C語言C語言
- C語言 typedefC語言
- C語言的本質(32)——C語言與彙編之C語言內聯彙編C語言
- C語言函式手冊:c語言庫函式大全|C語言標準函式庫|c語言常用函式查詢C語言函式
- C語言與嵌入式C語言的區別C語言
- C語言學習方法,怎麼學習C語言?C語言
- C 語言結構體記憶體佈局問題結構體記憶體
- C語言結構體記憶體佈局問題C語言結構體記憶體