C語言 共用體

西北野狼發表於2024-10-02
  1. 概念
    • 在C語言中,共用體(Union)是一種特殊的資料型別。它可以在不同的時刻儲存不同型別的資料,但所有成員共享同一塊記憶體空間。這與結構體不同,結構體的每個成員都有自己獨立的記憶體空間。
  2. 定義和宣告
    • 定義
      • 共用體的定義形式與結構體相似,使用關鍵字union。例如:
        union Data {
            int num;
            char ch;
            float f;
        };
        
      • 這裡定義了一個名為Data的共用體,它有三個成員:int型別的numchar型別的chfloat型別的f
    • 宣告
      • 可以在定義共用體之後宣告共用體變數。例如:
        union Data data;
        
      • 也可以在定義共用體的同時宣告共用體變數:
        union Data {
            int num;
            char ch;
            float f;
        } data;
        
  3. 記憶體共享特性
    • 由於共用體的所有成員共享同一塊記憶體空間,所以共用體的大小取決於其最大成員的大小。例如,在上述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的值是不確定的
      
  4. 使用場景
    • 節省記憶體空間
      • 在某些情況下,如果有一組資料,這些資料不會同時使用,就可以使用共用體來節省記憶體空間。例如,在一個裝置驅動程式中,可能有一個資料結構用於儲存裝置的狀態資訊,這個狀態資訊可能是一個整數表示的錯誤程式碼,或者是一個字元表示的裝置狀態標識,使用共用體可以避免為這兩種不同型別的狀態資訊分別分配獨立的記憶體空間。
    • 資料型別轉換
      • 共用體可以用於實現簡單的資料型別轉換。例如,將一個整數轉換為位元組陣列。可以定義一個共用體,其中一個成員是整數,另一個成員是字元陣列,透過給整數成員賦值,然後從字元陣列成員中獲取位元組資料。
  5. 與結構體的區別
    • 記憶體分配
      • 結構體的每個成員都有自己獨立的記憶體空間,結構體的大小是所有成員大小之和(考慮記憶體對齊)。而共用體所有成員共享同一塊記憶體空間,其大小取決於最大成員的大小。
    • 資料儲存和訪問
      • 在結構體中,可以同時儲存和訪問多個成員的值。在共用體中,同一時刻只能儲存和訪問一個成員的值,因為成員共享記憶體,給一個成員賦值會影響其他成員的值。
  6. 注意事項
    • 資料覆蓋風險
      • 由於共用體成員共享記憶體,在使用共用體時要特別注意資料覆蓋的問題。如果不小心訪問了已經被覆蓋的成員的值,可能會得到錯誤的結果。
    • 型別相容性
      • 在使用共用體進行資料轉換或操作時,要確保資料型別之間的相容性。例如,不能將一個不相容的資料型別賦給共用體成員,否則可能會導致程式執行時錯誤。

相關文章