Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình C

Union (Hợp) trong C

Union là kiểu dữ liệu do người dùng định nghĩa. Tất cả thành viên (members) chia sẻ cùng một vùng nhớ. Kích thước union = kích thước thành viên lớn nhất. Dùng khi muốn dùng chung bộ nhớ cho nhiều biến (chỉ một biến có giá trị tại một thời điểm).

Cú pháp

union union_name {
    member_definitions;
} union_variables;

Ví dụ

#include <stdio.h>
#include <string.h>

union Data {
    int i;
    float f;
} data, data1;

int main() {
    printf("Kich thuoc union Data: %zu\n", sizeof(data));
    printf("Kich thuoc data1: %zu\n", sizeof(data1));
    
    data.i = 10;
    printf("data.i = %d\n", data.i);
    data.f = 3.14f;
    printf("data.f = %.2f (data.i now garbage: %d)\n", data.f, data.i);
    
    return 0;
}

Kết quả

Kich thuoc union Data: 4
Kich thuoc data1: 4
data.i = 10
data.f = 3.14 (data.i now garbage: 1078523331)

Giải thích: Union Data có int i (4 bytes) và float f (4 bytes). Kích thước union = max(4,4) = 4. Gán i=10 rồi gán f=3.14 ghi đè cùng vùng nhớ -> i thành giá trị rác.

Union vs Struct

Đặc điểmUnionStruct
Bộ nhớChia sẻ (overlay)Tách biệt (cộng dồn)
Kích thướcMax thành viênTổng + padding
Giá trị đồng thờiChỉ 1 thành viênTất cả thành viên
Dùng choTiết kiệm RAM, type punningNhóm dữ liệu liên quan
Cảnh báo: Truy cập thành viên union không phải lần ghi gần nhất nhất là undefined behavior (trừ khi dùng cho type-punning qua char array hoặc C++17 std::variant).