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ểm | Union | Struct |
|---|---|---|
| Bộ nhớ | Chia sẻ (overlay) | Tách biệt (cộng dồn) |
| Kích thước | Max thành viên | Tổng + padding |
| Giá trị đồng thời | Chỉ 1 thành viên | Tất cả thành viên |
| Dùng cho | Tiết kiệm RAM, type punning | Nhó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).